有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

c#无法使用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; }
}

爪哇:

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) 个答案

  1. # 1 楼答案

    好的,这是一个很酷的问题——我将继续回答这个问题,因为评论越来越长

    首先,在读取数据时,问题在于解析器。它在二进制负载上受到欺骗,并遇到非法字符异常。这是因为它试图处理一个大字节数组,但遇到了一个无法处理的字符或字节(可能是因为二进制文件中有一个字节无法转换为UTF-8。此外,请记住,字符在C#中通常为1字节,在java中通常为2字节)

    我认为有两个原因可能是原因

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

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

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

  2. # 2 楼答案

    根据上面评论的内容

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

    看看Gson是如何序列化byte[]

    "a":[96,-76,32,-69,56,81,-39,-44...
    

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