【发布时间】:2016-06-05 03:11:40
【问题描述】:
我的代码中的一些对象出现在多个列表/地图中。例如:对象 Question 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 时,它会创建与原始对象不同的对象,因此在线玩家无法在反序列化后仍然引用同一个对象。我应该编写一个自定义方法在反序列化后将新创建的“John 1”实例添加到 onlinePlayers 吗?
谢谢
【问题讨论】:
-
"ArrayList java和ArrayList序列化"是什么意思?
-
听起来你需要Custom Deserialization。
标签: java json serialization collections gson