Я пытаюсь отправить IPEndpoint через protobuf-net, и я заметил, что при десериализации массива из 4 байтов в адрес IP4 код набора получает значение 8 байтов . Четыре байта содержат исходный адрес и еще 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); } } }