我可以序列化ArrayList而不序列化保存的对象吗?

时间:2016-06-05 03:11:41

标签: java json serialization collections gson

我的代码中的某些对象出现在多个列表/地图中。 E.G:对象问题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的List,它引用了一个“John 1”的实例,它也恰好位于List allPlayers中,没有重复“John 1”还在提到那个对象吗? 我猜测当我反序列化allPlayers时,它会创建与原始对象不同的对象,因此在反序列化之后,onlinePlayers仍然无法引用同一个对象。我应该编写一个自定义方法,在反序列化后将新创建的“John 1”实例添加到onlinePlayers吗?

谢谢

1 个答案:

答案 0 :(得分:1)

  

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

简短回答。否。

序列化的一点是,您可以从序列化中重建原始对象的副本。如果您不包含列表元素的序列化,那么您将无法重建列表。

我认为您需要将要尝试序列化的列表类型更改为名称列表,而不是播放器列表。或者,考虑使用数据库而不是&#34; dumb&#34;序列化。

  

我的问题是,有什么方法可以实现这一点,所以我可以反序列化一个名为onlinePlayers的列表,它引用了一个&#34; John 1&#34;的实例,它也恰好是列出allPlayers,不重复&#34; John 1&#34;还在提到那个对象吗?

如果您使用的是Java对象序列化,则可以在readResolve对象上实现Player方法,该方法查找要反序列化的对象,并将其与&#34; global&#34;进行比较。内存数据结构。 (但这在概念上在许多层面都是错误的。)

您可以使用GSON自定义反序列化器执行类似操作。或者,您可以使用基于事件的JSON阅读器并使用事件来提取所需的信息。

但我认为这是错误的方法。

这是问题的核心。

  

但是,我想从玩家列表中提取数据(包含数千个对象)......

如果您有数千个对象,

序列化/反序列化是错误的解决方案:

  • 要更新,您需要序列化/编写整个列表及其包含的所有对象。每一次。即使你只做了很小的改变。

  • 要阅读,您需要进行大部分的反序列化工作,即使是您提出的&#34; hack&#34;。

  • 对序列化表单进行查询没有简单快捷的方法。

  • 在某些时候,您需要在内存中保存整个反序列化的对象图。这不会扩展。

您应该使用某种数据库。