2012-02-04 14 views
6

Lo que estoy haciendo es intentar enviar un IPEndpoint a través de protobuf-net y lo que observé es que al deserializar la matriz de 4 bytes en la dirección IP4, el código establecido recibe un valor de 8 bytes. Cuatro bytes que contienen la dirección original y 4 bytes más que contienen la dirección serializada. Al recorrer el código, he podido confirmar que cuando se llama a Deserialize, primero lee los bytes y luego establece los bytes.protobuf-net OverwriteList en Byte Array

Después de leer algo, aprendí sobre OverwriteList, y como se puede ver en el ejemplo a continuación, lo he configurado como verdadero. Sin embargo, al setter todavía se le proporciona un valor de 8 bytes.

¿Alguien tiene una idea de lo que estoy haciendo mal?

Este código de ejemplo debe lanzar una excepción cuando se usa con protobuf-net r480, Visual Studio 2010 como una aplicación de consola .Net 4.0.

 
using ProtoBuf; 
using System.Net; 
using System.IO; 

namespace ConsoleApplication1 
{ 

    [ProtoContract] 
    class AddressOWner 
    { 
     private IPEndPoint endpoint; 

     public AddressOWner() 
     { endpoint = new IPEndPoint(new IPAddress(new byte[] {8,8,8,8}), 0); } 

     public AddressOWner(IPEndPoint newendpoint) 
     { this.endpoint = newendpoint; } 

     [ProtoMember(1, OverwriteList=true)] 
     public byte[] AddressBytes 
     { 
      get { return endpoint.Address.GetAddressBytes(); } 
      set { endpoint.Address = new IPAddress(value); } 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      AddressOWner ao = new AddressOWner(new IPEndPoint(new IPAddress(new byte[] { 192, 168, 1, 1 }), 80)); 

      MemoryStream ms = new MemoryStream(); 
      Serializer.Serialize(ms, ao); 
      byte[] messageData = ms.GetBuffer(); 
      ms = new MemoryStream(messageData); 
      AddressOWner aoCopy = Serializer.Deserialize<AddressOWner>(ms); 
     } 
    } 
} 
+0

Comprobará esta tarde –

Respuesta

3

Parece que este es en realidad un error, específico para byte[], que se maneja como un protobuf particular, primitiva. Otras matrices/listas se asignan a repeated (en términos de protobuf) y manejan la opción OverwriteList correctamente. Voy a modificar el manejo de byte[] para admitir esta opción.

Editar: se fija en la R484, con el apoyo integration test

+0

Traté de construir desde la fuente y pensé que era un éxito, pero el DLL creé todavía tenía el mismo comportamiento. ¿Hay algún tipo de horario de lanzamiento? Mi trabajo por ahora es copiar los bytes correctos a una nueva matriz durante el establecimiento de propiedades. –

+0

@William tan pronto como haya validado algunas otras correcciones. –

+0

Estoy usando la versión 2.0.0.480 de Nuget que contiene este error. Sería genial tener un paquete más nuevo disponible, o al menos algún tipo de solución alternativa. –