Невозможно десериализовать byte [] с помощью 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 не добавляет к строке?


person Yonatan Nir    schedule 24.08.2012    source источник
comment
@MAXE Десериализация выполняется Gson   -  person Yonatan Nir    schedule 24.08.2012
comment
Json - это стандарт, подобный XML, а Gson выглядит как библиотека, написанная Google.   -  person FaddishWorm    schedule 24.08.2012
comment
Приносим извинения, откат не удался ›.›   -  person Rawling    schedule 24.08.2012
comment
вы пробовали использовать Byte с большой буквы в Java?   -  person FaddishWorm    schedule 24.08.2012
comment
Как JSON выглядит в UTF-8? Можете предоставить образец?   -  person Farid Nouri Neshat    schedule 24.08.2012
comment
Самый простой способ проверить это - попробовать сериализовать byte [] с помощью gson и посмотреть, чем вывод отличается от версии JSON.Net. Если я правильно помню, gson ожидает кучу информации заголовка в байтовых массивах. Возможно, вам придется написать собственный десериализатор, который работает с данными байта [] JSON.Net.   -  person Tim Copenhaver    schedule 24.08.2012
comment
@alFReDNSH Json получил выглядит следующим образом: {имя: д д, пол:, день рождения: от: около:, изображение: / 9J / 4AAQSkZJRgABAgEAYABgAAD / 7gAOQWRvYmUAZAAAAAAB / + EQskV4aWYAAE1NACoAAAAIAAKHaQAEAAAAAQAACDLqHAAHAAAIDAAAACYAAAAAHOoAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA .... (хранение как и на некоторое время более)   -  person Yonatan Nir    schedule 24.08.2012
comment
@TimCopenhaver Я согласен с этим. Вы не можете отправлять байтовые массивы, не написав собственный десериализатор. У вас может быть целая куча проблем. Лично я бы отправил изображения отдельно, без использования оболочки Json. Я предполагаю, что синтаксический анализатор получает часть Byte [], ожидает строку, а затем читает двоичные символы, которые находятся за пределами набора UTF-8, что вызывает исключение недопустимого символа.   -  person FaddishWorm    schedule 24.08.2012
comment
Попробуйте создать строковый объект из массива байтов с использованием кодировки UTF-8 в C #   -  person FaddishWorm    schedule 24.08.2012
comment
@FaddishWorm, в конце концов, я превратил массив байтов в короткий массив, и это сработало. Итак, поскольку ваш ответ о построении строки совпадает с той же идеей, пожалуйста, укажите это как ответ, и я приму его как правильный   -  person Yonatan Nir    schedule 25.08.2012


Ответы (2)


Учитывая часть ввода из комментария выше

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

и глядя на то, как Gson сериализует byte[]

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

ответ очевиден: Gson использует массив json, а json.net - строку json. Вы должны изменить одно или другое. Написать собственный сериализатор для gson легко (хотя я никогда не пробовал использовать byte[]), то же самое, вероятно, справедливо и для другого инструмента.

person maaartinus    schedule 24.08.2012

Хорошо, это классный вопрос - я попытаюсь ответить на него, потому что комментарии становятся очень длинными.

Во-первых, проблема в вашем парсере, когда вы читаете данные. Он обманывается с двоичной полезной нагрузкой и обнаруживает исключение недопустимого символа. Это связано с тем, что он пытается иметь дело с большим ByteArray, но встречает символ или байт, с которыми он не может справиться (вероятно, потому, что в двоичном файле есть байт, который не может быть преобразован в UTF-8. Также помните, что символы обычно 1 байт в C # и 2 байта в java.

Я думаю, что есть две причины, которые могут быть причиной этого.

  1. Программа чтения gson не распознает отправляемый вами тип "byte []" и обрабатывает ваш двоичный файл как строку в кодировке UTF-8.

  2. Массивы байтов JSON.NET не интерпретируются так же, как массив gson, поэтому он не будет работать без написания десериализатора, совместимого с JSON.NET.

Я думаю, вам нужно продолжать смотреть на данные, попробовать изменить кодировки, а также посмотреть, сможете ли вы получить парсер gson для java, который дает вам больше контроля, чем этот :)

person FaddishWorm    schedule 24.08.2012
comment
есть ли кодировка, которая более универсальна и имеет больше шансов быть распознанной обеими сторонами? - person Yonatan Nir; 24.08.2012
comment
Я думаю, что UTF-16 позволяет использовать больше символов. Вы пробовали это? - person FaddishWorm; 24.08.2012
comment
хотя UTF-8 и UTF-16 являются кодировками переменной длины, я почти уверен - person FaddishWorm; 24.08.2012
comment
Вы пытались изменить его с байта на байт в java? - person FaddishWorm; 24.08.2012
comment
Вы пытались сделать поле изображения синтетическим или временным, чтобы облегчить отладку? Может, вы должны сделать байт [] синтетическим, а затем десериализовать его вручную? - person FaddishWorm; 24.08.2012
comment
давайте продолжим обсуждение в чате - person FaddishWorm; 25.08.2012