2010-09-16 3 views
1

У меня есть бэкэнд java, который отправляет сообщения с помощью protobuf, он отправляет объекты с разделителями сообщений в один массив байтов массива по тибу. Я могу десериализовать их отлично, используя функцию parseDelimitedFrom (yourStreamHere) в java, но на стороне C# у нас есть некоторые проблемы, и я не мог найти примеров, но я могу просто пропустить что-то очевидное здесь.Deserializing Список сообщений с protobuf-net

Мы делаем что-то в C#, как этот

using (MemoryStream mem = new MemoryStream()) 
{ 
    mem.Write(byteArray, 0, byteArray.Length); 
    mem.Position = 0;  
    return Serializer.Deserialize<List<OrderState>>(mem); 
} 

Примечание: Я видел старше post на это, но это выглядело довольно устаревшей, и я думаю, что изменения произошли в Protobuf-сеть с тех пор, но правильно ли я м ошибаетесь

+0

Кстати ваше использование MemoryStream неэффективно. Вы можете просто обернуть свой байтовый массив в MemoryStream с помощью 'new MemoryStream (byteArray)' вместо создания MemoryStream с новым внутренним байтовым массивом и скопировать в него массив байтов. – dtb

+0

Я не думаю, что разница в том, что большая часть сделки, потому что MemoryStream собирается делать что-то вроде этого внутренне в любом случае, это всего лишь образец кода, есть ли у вас какое-либо понимание вопроса? – jtruelove

+0

Я не знаю, с верхней части моей головы, которые образуют parsedelimited использует. Сейчас я не на компьютере, но должен уметь смотреть позже. –

ответ

1

разработчик использует тег 0 и префикс стиль 128 в один момент вчера, как так

IEnumerable<SomeObject> list = (Serializer.DeserializeItems<SomeObject>(memoryStream, PrefixStyle.Base128, 0)); 

, но мы по-прежнему получаю сообщение об ошибка. Когда мы вызывали getProto на стороне C# сегодня, похоже, он преобразовывал наши свойства, которые были установлены для двойного типа для типа fixed64, на стороне java, которую мы указали double, поэтому я считаю, что это несоответствие вызывает ошибки, которые мы наблюдаем. Мы временно изменили эти поля на тип строки, и теперь работает этот фрагмент. Конечно, в идеале мы не хотим отправлять строки, когда нам это не нужно.

+0

> преобразуя наши свойства, которые были установлены двойным типом для типа fixed64 - вы имеете в виду белый en генерирует .proto? или на проводе? Существует недавнее исправление для генерации .proto для этого, но это не меняет фактической сериализации. –

+0

Я считаю, что при создании .proto на стороне C#, но когда запросы из java-сервисов поступали в него, это давало нам исключение, вероятно, потому, что входящий запрос использовал double, но определение C# имело fixed64, или вы что это никогда не произойдет? – jtruelove

+0

что сбивает с толку (для меня) то, что на проводе оба используют одинаковый формат. Это повлияло только на GetProto, поэтому я запутался ... –

Смежные вопросы