Преобразование значения UINT32 в массив UINT8 [4]

Вы дважды написали объект , но только сначала прочитали . Поэтому, если две копии объекта были написаны, вам нужно добавить второе чтение, чтобы увидеть вторую копию. Вероятно, было бы неплохо закрыть вывод перед чтением из файла, чтобы очистить буферы.

Но все, что сказал: ObjectOutputStream, только один раз записывает данный объект, а затем последует записи того же объекта записывают на него ссылки , а не вторую копию. Из документация :

Механизм сериализации по умолчанию для объекта записывает класс объекта, подпись класса и значения всех непереходных и не- статические поля. Ссылки на другие объекты (за исключением временных или статических полей) также заставляют записывать эти объекты. Несколько ссылок на один объект кодируются с использованием механизма обмена ссылками, так что графики объектов могут быть восстановлены в том же виде, что и при написании оригинала.

blockquote>

Идея заключается в том, что вы будете сериализуйте графы объектов одновременно. Мутирование графа объекта во время сериализации - довольно странная вещь. Я не могу найти документацию, в которой говорится, что она не поддерживается, но добавление второго чтения в ваш проект по-прежнему показывает «Test», а не «Test123», поэтому ...

Выписать два отдельных Human, вам нужно создать вторую перед записью:

import java.io.*;

public class Human implements Serializable {
    private int age;
    private String name;

    public void setAge(int a) {
        this.age = a;
    }

    public void setName(String n) {
        this.name = n;
    }

    public String toString() {
        return "[Human " + this.age + ", " + this.name + "]";
    }

    public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException
    {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("data.txt"))))
        {
            Human human = new Human();
            human.setAge(21);
            human.setName("Test");
            System.out.println("Human : " + human);
            oos.writeObject(human);
            human = new Human(); // <== Change
            human.setAge(21);    // <== Change
            human.setName("Test123");
            oos.writeObject(human);
        }
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("data.txt"))))
        {
            Human newHuman  = (Human)ois.readObject();
            System.out.println("newHuman1 :" + newHuman);
            newHuman  = (Human)ois.readObject();
            System.out.println("newHuman2 :" + newHuman);
        }
    }
}

Без этих строк, отмеченных выше, вторая запись просто приводит к ссылке на первый объект. Мы можем доказать, что вот так:

public static void main(String args[]) throws FileNotFoundException, IOException, ClassNotFoundException
{
    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("data.txt"))))
    {
        Human human = new Human();
        human.setAge(21);
        human.setName("Test");
        System.out.println("Human : " + human);
        oos.writeObject(human);
        human.setName("Test123");
        oos.writeObject(human);
    }
    try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("data.txt"))))
    {
        Human newHuman1  = (Human)ois.readObject();
        System.out.println("newHuman1 :" + newHuman1);
        Human newHuman2  = (Human)ois.readObject();
        System.out.println("newHuman2 :" + newHuman2);
        System.out.println("Same object? " + (newHuman1 == newHuman2));
    }
}

... который выводит:

Human : [Human 21, Test]
newHuman1 :[Human 21, Test]
newHuman2 :[Human 21, Test]
Same object? true

13
задан Chris 28 June 2011 в 08:31
поделиться