【问题标题】:Can't deserialize byte[] using Gson无法使用 Gson 反序列化 byte[]
【发布时间】:2012-08-24 12:37:05
【问题描述】:

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

【问题讨论】:

  • @MAXE Gson 正在反序列化
  • Json 是像 XML 一样的标准,而 Gson 看起来像 google 写的库
  • 抱歉,回滚出错>.>
  • 你试过在java中使用带有大写B的字节吗?
  • JSON 在 UTF-8 中的样子如何?可以提供样品吗?

标签: c# java json json.net gson


【解决方案1】:

鉴于上述评论的输入

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

看看 Gson 如何序列化byte[]

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

    • 有没有更“通用”、最有机会被双方识别的编码?
    • 我认为 UTF-16 允许更多字符。你试过吗?
    • 虽然 UTF-8 和 UTF-16 都是可变长度编码我很确定
    • 您是否尝试在 java 中将其从字节更改为字节?
    • 您是否尝试过使图像字段合成或瞬态以帮助您调试?也许你应该使 byte[] 合成,然后手动反序列化它?
    猜你喜欢
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2017-01-27
    相关资源
    最近更新 更多