2017-09-27 28 views
2

继续从this question;如何使用两个引用对对象进行反序列化?

请给出一个简短的例子,说明如何用两个引用反序列化一个对象。

我已经包含下面的代码,所以所有的答案引用相同的对象名称。

public class Person implements Serializable{ 
    private String name; 
    private int age; 
    private boolean single; 
    private int numKids; 
    private final static long serialVersionUID = 1L; 

    public Person(String name, int age, boolean single, int numKids) { 
     this.name = name; 
     this.age = age; 
     this.single = single; 
     this.numKids = numKids; 
     this.surname = surname; 
    } 
} 

假设如下:

  1. 一个文本文件,已创建
  2. 我们创建了一个Person对象jim
  3. 还有另外一个人鲍勃引用jim对象

该曲已经引用的estion描述了如何将jim写入文件。 bob参考不是。那么如果文件可能包含Person类的其他几个对象,那么我们如何读取jimbob的值?我们如何确保bob具有正确的值?

+1

您必须使用Person的集合并对其进行序列化。 –

回答

2

你似乎有点困惑。您的人员类别不是允许参考另一个人员对象。您需要在Person类中的Person字段才能达到此目的!从这个角度来看,你的问题没有意义:jimbob将是两个完全独立的对象,并且序列化其中的一个根本不会串行化另一个对象!

但除此之外:通常情况下,当你觉得在复数的东西(如多个人的),那么你将有一个封闭的“容器”的对象(如List<Person>),你想想。你不需要处理单个Person对象 - 但是在考虑序列化时使用这些容器!

您正试图构建一个根本无法解决的仿真示例。相反,想一想Person类可能有一个字段Person spouse的情况。然后alice可以被bob参考。当你现在有这些Person对象,还有更多的在列表中,并且你序列化了这个列表 - 那么系统将确保alicebob只被序列化一次。

0

我有点困惑你的问题 - 也许是因为我没有看到任何问题与相同的对象和/或多个对象的序列化和反序列化,有或没有任何对象的引用。

重点是序列化就像创建对象的副本(在文件系统或某处)。这个副本可以在内存中重新创建(反序列化)。 您可以在内存中创建对象(反序列化)一次或多次。

它是这样的:

object A --serialization--> file A 
file A --deserialization--> object A' 
file A --deserialization--> object A" 

对象A,A”和A”是不同的对象 - 但所有字段将拥有相同的价值观。

如果对象A包含一个复杂的结构(可以序列化/反序列化),它也可以是另一个对象,那么同样的机制也可以用于这些对象。

所有字段将具有相同的值,但对象将不同。

看的示例代码:

package test; 

import java.io.Serializable; 

public class Person implements Serializable { 
    int id; 
    String name; 

    public Person(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 
} 

和一种测试

package test; 

import java.io.*; 

public class Main { 
    public static void main(String... args) { 
     Person p1 = new Person(1, "aaa"); 
     Person p1a = null; 
     Person p1b = null; 
     try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.data"))) { 
      oos.writeObject(p1); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try (ObjectInputStream oos = new ObjectInputStream(new FileInputStream("test.data"))) { 
      p1a = (Person) oos.readObject(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

     try (ObjectInputStream oos = new ObjectInputStream(new FileInputStream("test.data"))) { 
      p1b = (Person) oos.readObject(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 

     assert p1a != null && p1b != null; 
     assert p1a.id == p1b.id; 
     assert p1.id == p1b.id; 
     assert p1.name.equals(p1a.name); 
     assert p1a.name.equals(p1b.name); 

     System.out.println(String.format("Three different object: %s, %s, %s", p1, p1a, p1b)); 


    } 
} 

PS的。 java.lang.String如何在内存中复制/存储/管理对象,这是不同的故事。

相关问题