java - 在 Java 中使用序列化(使用 writeObject 方法)写入文件

标签 java serialization deserialization

在下面的代码中,我尝试将序列化对象写入顺序访问文件。此代码使用包中包含的另一个类“Account”,该包实现“Serializable”接口(interface)并包含 4 个实例变量,即。 acc_no、名字、姓氏和余额用于维护个人的记录以及他的名字、姓氏、帐号和余额。现在我面临的问题是,当我添加 2 个或更多记录时,我只能将第一个记录写入两次或多次,而第二个记录和后续记录不会保存,即执行代码时的以下条目:

Enter in the following order :
Account number, first name, last name, balance : 100 russel crowe 1000000
200 tom hanks 3000000
300 will smith 4000000

当我通过反序列化(此处未提及的代码)从文件中读取上述数据时,会观察到以下输出:

100 russel crowe 1000000.0
100 russel crowe 1000000.0
100 russel crowe 1000000.0

但是,当我为每个记录条目创建一个新的 Account 对象时,我得到了预期的输出。

所以,我的问题是为什么具有“writeObject(record)”方法的“record”对象只保留第一个条目?为什么总是需要创建一个新的 Account 对象才能获得预期的输出?抱歉,我的疑问有点长了。希望我已经成功传达了我想问的内容。

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.NoSuchElementException;
import java.util.Scanner;

import packtest.account.Account;
public class SerizbleTest {

    private static ObjectOutputStream obj;
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        Account record = new Account();
        System.out.printf("Enter in the following order :%nAccount number, first name, last name, balance : ");
        try {
            obj = new ObjectOutputStream(new FileOutputStream("sertest1.ser"));
            while (in.hasNext()) {
                //record = new Account();
                record.setAccount(in.nextInt());
                record.setFirst(in.next());
                record.setLast(in.next());
                record.setBalance(in.nextDouble());
                //System.out.println(record.getAccount());
                obj.writeObject(record);
            }
        }
        catch (NoSuchElementException e) {
            System.out.println("Invalid input entered !!!");
            in.nextLine(); //discarding the input
        }
        catch (FileNotFoundException e) {
            System.out.println("File Does not Exist");
            in.close();
            //obj.close();
            System.exit(1);
        }
        catch (IOException e) {
            System.out.println("IOException occurred !!!");
        }
    }

}

最佳答案

Java 序列化是为序列化对象图而设计的。它为每个对象记录一个 id,如果您两次写入同一个对象,它只会记录您再次写入该对象。这就是为什么它们都与第一个对象相同,因为给定的对象只写入一次。

两种解决方案;

  • 每次写入一个新对象。
  • 在写入之间调用 obj.reset(); 或使用 obj.writeUnshared(record); 将“非共享”对象写入 ObjectOutputStream。此方法与 writeObject 相同,只是它始终将给定对象作为新的、唯一的对象写入流中(而不是指向先前序列化实例的反向引用)。

关于java - 在 Java 中使用序列化(使用 writeObject 方法)写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27661540/

相关文章:

java - CrudRepository 不允许删除 @RequestMapping

Java:检查给定的IP和端口是否是代理服务器

c# - 继承和 JSON 转换

c# - Json.NET:反序列化嵌套字典

java - vaadin 如何有选择地将复选框放在树表上

java - 扭曲排序

c# - 跨 AppDomain 的自定义序列化

Haskell:获取一个 Get monad 并返回无限类型的多态性

java - 底层类结构更改后反序列化对象

c# - Service Fabric 可靠集合 : serialization issue