无法使用 Gson 反序列化字节 []



我有一个用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个字节。

我认为造成这种情况的原因有两个。

  1. gson读取器没有接收到您发送的"byte[]"类型,而是将您的二进制文件视为UTF-8编码的字符串。

  2. JSON.NET字节数组的解释方式与gson不同,因此如果不编写与JSON.NET兼容的反序列化程序,它将无法工作

我认为您需要继续查看数据,尝试更改编码,并查看是否可以获得一个用于java的gson解析器,该解析器可以为您提供比此解析器更多的控制:)

相关内容

  • 没有找到相关文章

最新更新