4

我有一个用 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 不添加到字符串的数组的开头?

4

2 回答 2

3

鉴于上述评论的输入

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

并查看 Gson 如何序列化byte[]

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

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

于 2012-08-24T18:58:19.970 回答
-1

好的,这是一个很酷的问题 - 我将继续尝试回答这个问题,因为评论变得很长。

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

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

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

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

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

于 2012-08-24T13:06:40.917 回答