我的代码中的某些对象出现在多个列表/地图中。 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吗?
谢谢
答案 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;。
对序列化表单进行查询没有简单快捷的方法。
在某些时候,您需要在内存中保存整个反序列化的对象图。这不会扩展。
您应该使用某种数据库。