![](/img/trans.png)
[英]How to serialize a java object which contains object references without serializing the objects referred to?
[英]Can I serialize an ArrayList without serializing objects which holds?
我的代码中的某些对象出现在多个列表/映射中。 EG:对象问题myQuestion在ArrayList java和ArrayList序列化中。 据我所知,Gson会序列化ArrayList中的对象以及ArrayList本身。 为了测试它,我运行了以下代码:
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class serTries {
public static void main(String[] args) {
List<Player> players=new ArrayList<>();
List<Player> secondaryPlayer =new ArrayList<>();
for(int i=0;i<3;i++) {
players.add(i, new Player("John " + i));
secondaryPlayer.add(players.get(i));
} //creating 3 Player objects and putting them in 2 different lists.
try {
Gson gson = new Gson();
String ser=gson.toJson(players);
String secondarySer=gson.toJson(secondaryPlayer);
Type ct = new TypeToken<ArrayList<Player>>(){}.getType();
System.out.println("First list:\n" + ser + "\nSecond list:\n" + secondarySer);
}catch( Exception e)
{
e.printStackTrace();
} } }
它产生以下内容:
第一清单:
[{“ name”:“ John 0”},{“ name”:“ John 1”},{“ name”:“ John 2”}]
第二个清单:
[{“ name”:“ John 0”},{“ name”:“ John 1”},{“ name”:“ John 2”}]
当我通过输入创建新列表时
List<Player> deserializedPlayers = gson.fromJson(ser, ct);
List<Player> deserializedSecondaryPlayers = gson.fromJson(secondarySer, ct);
它创建6个不同的对象(第一个列表中的3个玩家,第二个列表中的3个玩家)。
我的问题是,有什么办法可以使我可以序列化/反序列化一个名为onlinePlayers的列表,该列表引用“ John 1”的一个实例,该实例也恰好位于List allPlayers中,而无需重复“ John 1”对那个对象?
我猜想当我反序列化allPlayers时,它将创建与原始对象不同的对象,因此在反序列化之后,onlinePlayers仍然无法引用相同的对象。 我应该编写自定义方法在反序列化后将新创建的“ John 1”实例添加到onlinePlayers吗?
谢谢
我可以序列化一个ArrayList而不序列化持有的对象吗?
简短的答案。 没有。
序列化的重点是您可以从序列化中重建原始对象的副本。 如果您不包括列表元素的序列化,那么您将无法重建列表。
我认为您需要将要序列化的列表的类型更改为名称列表,而不是播放器列表。 或者,考虑使用数据库而不是“哑”序列化。
我的问题是,有什么办法可以使我反序列化一个名为onlinePlayers的列表,该列表引用“ John 1”的一个实例,该实例也恰好在List allPlayers中,而无需重复“ John 1”宾语?
如果使用Java对象序列化,则可以在Player
对象上实现readResolve
方法,该方法查找要反序列化的对象并将其与“全局”内存数据结构进行比较。 (但是从概念上讲,这在许多级别上都是错误的。)
您可以使用GSON自定义解串器执行类似的操作。 或者,您可以使用基于事件的JSON阅读器,并使用事件提取所需的信息。
但是我认为这是错误的方法。
这是问题的核心。
但是,我想从玩家列表(包含数千个对象)中提取数据...
如果您有数千个对象,则序列化/反序列化是错误的解决方案:
要更新,您需要序列化/写入整个列表及其包含的所有对象。 每一次。 即使您只做了很小的更改。
要阅读,您需要完成反序列化的大部分工作,即使您建议使用“ hack”。
没有简单/快速的方法可以对序列化表格进行查询。
在某些时候,您需要将整个反序列化的对象图保存在内存中。 这不会扩展。
您应该使用某种数据库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.