gpt4 book ai didi

java - 序列化在构造函数中初始化的映射

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:17:44 26 4
gpt4 key购买 nike

我刚刚遇到一个与 Java 序列化相关的有趣问题。

看来如果我的 map 是这样定义的:

Map<String, String> params = new HashMap<String, String>() {{
put("param1", "value1");
put("param2", "value2");
}};

然后我尝试使用 ObjectOutputStream 将它序列化为一个文件:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(outputFile));
oos.writeObject(params);

...我得到 java.io.NotSerializableException。

但是,如果我以标准方式将值放入 map :

Map<String, String> params = new HashMap<String, String>();
params.put("param1", "value1");
params.put("param2", "value2");

...然后序列化工作正常。

谁能告诉我为什么会这样,这些陈述之间有什么区别?我认为它们的工作原理应该相同,但显然我遗漏了一些东西。

最佳答案

第一个例子是创建一个匿名内部类。怎么样?

Map<String, String> params = new HashMap<String, String>() {};

将创建一个派生自 HashMap 的新类(注意以下大括号,您可以在其中放置方法、成员等)

您的 map 初始化然后声明一个初始化程序 block :

Map<String, String> params = new HashMap<String, String>() { 
{ // here }
};

并在其中调用填充方法。

这个习惯用法很好,但您必须意识到您正在创建一个新类,而不仅仅是一个新对象。

因为这个类是一个内部类,它会有一个隐式的 this 指针指向包含的外部类。您的匿名类将是可序列化的,因为它派生自可序列化类。但是您的外部类(由 this 指针引用)不是。

XStream 这样的工具,通过反射序列化为 XML,会发现 this 指针并尝试序列化周围的对象,这同样令人困惑。

关于java - 序列化在构造函数中初始化的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11736754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com