我已经看过很多关于这个主题的问题,但似乎找不到解决我问题的方法。
我收到了反序列化错误:
com.google.gson.JsonSyntaxException:java.lang.IllegalStateException: 预计BEGIN_OBJECT但在STRING第1栏第3384行
特别是反序列化我的RoutingTable clas时,decerialization非常适合其他所有东西。我在这里上传了序列化的json数据:http://jsonfiddle.net/bx0ga
要序列化的类:
public class RoutingTable
{
private transient final Node localNode; // The current node
private final KadBucket[] buckets;
{
buckets = new KadBucket[NodeId.ID_LENGTH];
}
// Methods....
}
KadBucket课程:
public class KadBucket implements Bucket
{
private final int depth;
private final Map<NodeId, Node> nodes;
{
nodes = new HashMap<>();
}
// methods and so on
}
序列化代码:我有一个序列化类,使用泛型来处理序列化:
public class JsonSerializer<T> implements KadSerializer<T>
{
private final Gson gson;
{
gson = new Gson();
}
@Override
public void write(T data, DataOutputStream out) throws IOException
{
try (JsonWriter writer = new JsonWriter(new OutputStreamWriter(out)))
{
writer.beginArray();
/* Store the content type */
gson.toJson(data.getClass().getName(), String.class, writer);
/* Now Store the content */
gson.toJson(data, data.getClass(), writer);
writer.endArray();
}
}
@Override
public T read(DataInputStream in) throws IOException, ClassNotFoundException
{
try (DataInputStream din = new DataInputStream(in);
JsonReader reader = new JsonReader(new InputStreamReader(in)))
{
reader.beginArray();
/* Read the class name */
String className = gson.fromJson(reader, String.class);
/* Read and return the Content*/
return gson.fromJson(reader, Class.forName(className));
}
}
}
因此,对于序列化,我这样做:
// Writing to dout which is an output stream
new JsonSerializer<RoutingTable>().write(this.localNode.getRoutingTable(), dout);
// Reading from din which is an input stream
RoutingTable irtbl = new JsonSerializer<RoutingTable>().read(din);
除了路由表之外,使用它对系统中的每个其他类都非常有效。
答案 0 :(得分:0)
RoutingTable包含瞬态的类变量,用于表示不应序列化字段。
答案 1 :(得分:0)
对我而言,您的输入似乎不是JSON对象。也曾经发生过一次,但我不记得究竟是什么问题,但我想这是因为开始时的空间。 查看为反序列化提供的原始输入,并将其转换为适当的json对象。