2014-02-01 5 views
1

Java 프로그램을 사용하여 읽으려고하는 couchbase에 저장된 .NET 직렬화 객체가 있습니다. protobuf-net을 사용하여 객체를 직렬화했으며 해당 코드를 변경할 수 없습니다. 직렬화 된 주석이 달린 클래스를 보여주는 코드 스 니펫을 아래에 첨부했습니다. 내가 오류가 발생, 내가 그것을 해제 직렬화 할 때, 그러나protobuf-net 직렬화 된 객체를 Java로 변환

message A { 
optional uint32 field1 = 1; 
optional uint32 field2 = 2; 
optional uint32 field3 = 3; 
repeated uint64 field4 = 4 [packed=true]; 
optional bytes field5 = 5; 
repeated uint32 field6 = 6 [packed=true]; 
} 

을 -

[ProtoContract] 
[VersionType(Version = VersionNumbers.V3)] 
public class A : B 
{ 
    [ProtoMember(1)] 
    public UInt16 field1 { get; set; } 

    [ProtoMember(2)] 
    public UInt16 field2 { get; set; } 

    [ProtoMember(3)] 
    public UInt16 field3 { get; set; } 

    [ProtoMember(4, IsPacked = true)] 
    public List<UInt32> field4 { get; set; } 

    [ProtoMember(5, IsPacked = true)] 
    public byte[] field5 { get; set; } 

    [ProtoMember(6, IsPacked = true)] 
    public List<UInt16> field6 { get; set; } 
} 

나는 여기에 다른 게시물의 일부를 다음과 같이 보이는 .proto 파일을 만들려고 "프로토콜 메시지에 잘못된 태그 (제로)가 포함되어 있습니다." .proto 파일을 정의한 방식에 문제가 있다고 생각하지만 문제가 무엇인지 파악할 수 없습니다. 내가 여기서 실수하고 있니?

감사합니다. Vivek

답변

0

가장 좋은 방법은 Serializer.GetProto<A>()을 사용하여 protobuf-net이 일치하는 .proto가 어떻게 생겼다고 생각하는지 확인하는 것입니다. 내가 B에 대해 아무것도 가정하지 않으면, 내가 얻을 :

message A { 
    optional uint32 field1 = 1 [default = 0]; 
    optional uint32 field2 = 2 [default = 0]; 
    optional uint32 field3 = 3 [default = 0]; 
    repeated uint32 field4 = 4 [packed=true]; 
    optional bytes field5 = 5; 
    repeated uint32 field6 = 6 [packed=true]; 
} 

주요 차이점은 uint64uint32 대를 것 같다.

+0

내가 자세히 보았을 때 직렬화 된 객체는 protobuf-net에 의해 직렬화되지 않았습니다! 그 문제가 해결되었습니다. uint64를 uint32로 변경하면 저에게 효과적입니다. –

관련 문제