繁体   English   中英

我可以序列化一个ArrayList而不序列化持有的对象吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM