2013-02-06 2 views
1

구조체를 serialize하는 데 "protobuf-net"을 사용하지만 빈 배열을 반환합니다.protobuf-net 일련 번호가 빈 배열을 반환합니다.

public static byte[] PacketToArray(Packet packet) 
{ 
    IFormatter formatter = new BinaryFormatter(); 
    MemoryStream stream = new MemoryStream(); 

    Serializer.Serialize(stream, packet); 
    byte[] packetArray = stream.GetBuffer(); 

    stream.Close(); 

    return packetArray; 
} 

packetArray [] IST 끝에서 "{바이트 [0]}"그러나 일부 데이터가 있어야 를 "패킷"의 데이터이다.

[ProtoContract] 
public struct Packet 
{ 
    [ProtoMember(1)] 
    public int opcode; 

    [ProtoMember(2)] 
    public string message; 
} 

그리고 testings를 년 vor opcode 값은 0이고 메시지 값은 null입니다. 문제가 어디에 있습니까?

+0

난 당신이'ToByteArray()'대신''GetBuffer()의 호출 제안 - 그것은이 문제가 해결되지 않습니다, 그러나 그것은 * * 데이터의 오른쪽 양의 당신에게 바이트 배열을 줄 것이다, 나머지는 잘 했어. –

답변

2

테스트에서 값 또는 opcode는 0이고 메시지는 null입니다. 문제는 어디에 있습니까?

무슨 문제가 있다고 생각하십니까? 0 바이트는 protobuf-net을 위해 완벽하게 합법적이며, 직렬화하는 것이 흥미롭지 않기 때문에이 경우에 예상됩니다. 외부 데이터를 요구하지 않고 0null을 비 직렬화 할 수 있습니다. 여기서 중요한 점은 : 당신이 같은 0 바이트를 역 직렬화 , 당신은 다시Packet0 연산 코드와 null 메세지를 받게됩니다. 작업 완료.

여러 메시지를 개별적으로 읽을 수 있도록 "프레이밍"을 처리하려면 SerializeWithLengthPrefix (및 DeserializeWithLengthPrefix)을 사용하십시오. 그러나 여기에는 아무런 문제가 없습니다.

사실,하지만 코드에서 버그가 : 당신은 또한 .Length를 추적하지 않고 GetBuffer()를 사용하는 경우

byte[] packetArray = stream.GetBuffer(); 

, 당신은이 경우에 쓰레기가 들어있는 대형 백업 버퍼를, (얻을 것이다 0). 대신 ToArray()을 사용하십시오. 그래서 :

public static byte[] PacketToArray(Packet packet) { 
    using(MemoryStream stream = new MemoryStream()) { 
     Serializer.Serialize(stream, packet); // or SerializeWithLengthPrefix 
     return stream.ToArray(); 
    } 
} 
관련 문제