2013-04-08 2 views
1

Поэтому у меня есть небольшая проблема:C# Protobuf внутрисетевой сериализованная объект Java

сообщение отправляются с использованием MQTT, она состоит из ряда сериализованных объектов с использованием Protobuf-сети в C# (я не могу изменить этот код, но у меня есть доступ к источнику). На другом конце я получаю сериализованные объекты в Java, проблема в том, что я не могу десериализовать объекты, используя protobuf, если кто-нибудь когда-либо имел эту проблему и решал ее, пожалуйста, помогите :)

Пример объект из C#:

using ProtoBuf; 

namespace Concentrator.Services 
{ 
[ProtoContract] 
public class MeterID 
{ 
    private byte[] _id; 

    [ProtoMember(1)] 
    public byte[] ID 
    { 
     get { return _id; } 
     set { _id = value.Length == 16 ? value : null; } 
    } 

    [ProtoMember(2)] public string MeterType; 
} 
} 

Моя попытка воссоздать тот же объект в Java (файл .proto):

syntax = "proto2"; 

package mqtt.entity; 

option java_package = "mqtt.entity"; 
option java_outer_classname = "ProtoMeter"; 
message Meter { 
    optional bytes ID = 1; 
    optional string MeterType = 2; 
    } 

    message MeterID { 
    repeated Meter mid = 1; 
} 

решение этого примера будет огромная помощь, спасибо.

Код, в котором объект десериализации в C#:

var ms = new MemoryStream(data, 7, data.Length - 9) 
var res = Serializer.Deserialize<List<MeterID>>(ms); 

это работает в C#, я пытаюсь добиться того же в Java

+0

Вы говорите: «Я не могу, дескать, десериализировать объекты», но что происходит, когда вы пытаетесь? Ошибки компиляции? Ошибки времени выполнения? Повреждение данных? –

+0

Проверьте ошибку при попытке десериализации –

ответ

3

сообщение в коде C# соответствует просто:

message MeterID { 
    optional bytes ID = 1; 
    optional string MeterType = 2; 
} 

Нет необходимости в двухуровневой модели (если вы не используете *WithLengthPrefix в коде C#). Вы также можете получить этот вывод с помощью:

var proto = Serializer.GetProto<MeterID>(); 

С вашего редактирования, List<MeterID> может быть отображен в

message List_MeterID { 
    repeated MeterID items = 1; 
} 

использоваться в сочетании с предыдущего MeterID фрагмента. Это то, что у вас есть в этом вопросе. Так что дело доходит до «того, что в настоящее время происходит?».

+0

Я пытаюсь десериализовать в java, объекты входят в список, я обновляю первое сообщение, чтобы добавить код, где они десериализованы в C# –

+0

@cdanisor, вы не упомянули «Список ': p С этим, .proto от вашего оригинального вопроса в порядке. Так что тогда возникает вопрос - что теперь происходит? что не работает? вы получаете исключение ...? или...? –

+0

Теперь есть другая проблема :) Исключение в потоке «Обратный вызов клиента MQTT» java.lang.VerifyError: класс mqtt.entity.ProtoMeter $ MeterID переопределяет конечный метод getUnknownFields.() Lcom/google/protobuf/UnknownFieldSet; \t at java.lang.ClassLoader.defineClass1 (родной метод) Класс, сгенерированный protoc, кажется, прослушивается, он переопределяет окончательный метод. –

1

попробовать регенерировать прото-файл по GetProto<T>

+0

Более конкретно, я никогда не использовал protobuf до –

+1

'var res = Serializer.GetProto <Список >;' и использовать 'res' –

+0

Хорошо, получив это на C#, это хороший шаг, но как мне экспортировать его в java? –

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