我有一个用java编写的类和一个用c#编写的类。我正在将c#类序列化为json字符串,并尝试在java端对其进行反序列化。在我为这两个类添加byte[]字段之前,一切都非常顺利。以下是类定义:c#:
public class RegisterRequest : GenericRequest
{
public string name { set; get; }
public string sex { set; get; }
public string birthday { set; get; }
public string from { set; get; }
public string about { set; get; }
public byte[] image { set; get; }
}
java 语:
public class RegisterRequest extends GenericRequest{
private String name;
private String sex;
private String birthday;
private String from;
private String about;
private String pictureUrl;
private byte[] image;
}
c端的序列化使用: request.ToJson()
(json.net)和java反序列化使用: RegisterRequest rr = gsonObject.fromJson(msg, RegisterRequest.class);
(使用gson。msg是json字符串)
当我不发送字节数组中的任何内容时,它仍然工作。但当我填充数组时,java端出现了一个异常: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 159089
我想应该有一些东西来标记一个数组的开始,gson会标识这个数组,但是json.net不会添加到字符串中?
2条答案
按热度按时间xt0899hw1#
根据上面的评论
看看gson是如何序列化的
byte[]
```"a":[96,-76,32,-69,56,81,-39,-44...
tnkciper2#
好的,这是一个很酷的问题-我将继续并尝试回答这个问题,因为评论越来越长。
首先,在读取数据时,问题是解析器。它在二进制负载上被欺骗并遇到非法字符异常。这是因为它试图处理一个大的bytearray,但遇到了一个无法处理的字符或字节(可能是因为二进制文件中有一个字节无法转换为utf-8)。另外,请记住,字符在c#中通常是1字节,在java中也是2字节。
有两个原因,我认为可能是这个原因。
gson读取器没有接收到您发送的“byte[]”类型,而是将您的二进制文件视为utf-8编码的字符串。
json.net字节数组的解释方式与gson不同,因此如果不编写与json.net兼容的反序列化程序,它将无法工作
我认为您需要继续查看数据,尝试更改编码,同时,看看是否可以获得一个gson-parser for java,它比这个提供更多控制:)