我有一个用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没有添加到字符串中,是否需要标记数组的开始?
给定上方注释的输入片段
"image":"/9j/4AAQSkZJRgAB..."
以及Gson如何序列化byte[]
"a":[96,-76,32,-69,56,81,-39,-44...
答案很明显:Gson使用json数组,而json.net使用json字符串。你必须改变其中一个。为gson编写自定义序列化程序很容易(尽管我从未尝试过byte[]
),其他工具也可能如此。
好的,这是一个很酷的问题-我将继续尝试回答这个问题,因为评论越来越长了。
首先,问题在于您在读取数据时的解析器。它在二进制负载上被欺骗,并遇到非法字符异常。这是因为它试图处理一个大的ByteArray,但遇到了一个无法处理的字符或字节(可能是因为二进制文件中有一个字节无法转换为UTF-8)。另外,请记住,字符在C#中通常是1个字节,在java中也是2个字节。
我认为造成这种情况的原因有两个。
-
gson读取器没有接收到您发送的"byte[]"类型,而是将您的二进制文件视为UTF-8编码的字符串。
-
JSON.NET字节数组的解释方式与gson不同,因此如果不编写与JSON.NET兼容的反序列化程序,它将无法工作
我认为您需要继续查看数据,尝试更改编码,并查看是否可以获得一个用于java的gson解析器,该解析器可以为您提供比此解析器更多的控制:)