我正在尝试通过protobuf-net发送IPEndpoint,我观察到的是当将4字节数组反序列化为IP4地址时,设置代码接收8字节的值。包含orignal地址的四个字节,以及包含已序列化地址的另外4个字节。通过逐步执行代码,我已经能够确认在调用Deserialize时,它首先读取字节,然后设置它们的字节。
在做了一些阅读后,我了解了OverwriteList,并且如下例所示,我已将其设置为true。但是,设置器仍然提供8字节值。
有没有人知道我做错了什么?
当与protobuf-net r480,Visual Studio 2010一起用作.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 :(得分:3)
看起来这实际上是一个特定于byte[]
的错误,它作为特定的protobuf原语处理。其他数组/列表映射到repeated
(以protobuf术语表示),并正确处理OverwriteList
选项。我将调整byte[]
处理以支持此选项。
编辑:这已在r484中修复,支持integration test