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

gmol1639  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(909)

我有一个用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不会添加到字符串中?

xt0899hw

xt0899hw1#

根据上面的评论

"image":"/9j/4AAQSkZJRgAB..."

看看gson是如何序列化的 byte[] ```
"a":[96,-76,32,-69,56,81,-39,-44...

答案很明显:gson使用json数组,而json.net使用json字符串。你必须改变其中一个。为gson编写自定义序列化程序很容易(尽管我从未尝试 `byte[]` ),其他工具可能也是如此。
tnkciper

tnkciper2#

好的,这是一个很酷的问题-我将继续并尝试回答这个问题,因为评论越来越长。
首先,在读取数据时,问题是解析器。它在二进制负载上被欺骗并遇到非法字符异常。这是因为它试图处理一个大的bytearray,但遇到了一个无法处理的字符或字节(可能是因为二进制文件中有一个字节无法转换为utf-8)。另外,请记住,字符在c#中通常是1字节,在java中也是2字节。
有两个原因,我认为可能是这个原因。
gson读取器没有接收到您发送的“byte[]”类型,而是将您的二进制文件视为utf-8编码的字符串。
json.net字节数组的解释方式与gson不同,因此如果不编写与json.net兼容的反序列化程序,它将无法工作
我认为您需要继续查看数据,尝试更改编码,同时,看看是否可以获得一个gson-parser for java,它比这个提供更多控制:)

相关问题