ProtoBuf.net Свойства базового класса не включены при сериализации производного класса - PullRequest
4 голосов
/ 24 мая 2011

Используя последнюю бета-версию 2.0 ProtoBuf.net, я пытаюсь сериализовать производный класс (только пример), и я получаю пустой файл. Почему свойства базового класса не сериализуются?

[ProtoContract]
[Serializable]
public class Web2PdfClient : Web2PdfEntity
{

}

[ProtoContract]
[Serializable]
public class Web2PdfEntity : EngineEntity
{

    [ProtoMember(1)]
    public string Title { get; set; }
    [ProtoMember(2)]
    public string CUrl { get; set; }
    [ProtoMember(3)]
    public string FileName { get; set; }

}


[ProtoContract]
[Serializable]
public class EngineEntity
{

    public bool Result { get; set; }
    public string ErrorMessage { get; set; }
    public bool IsMembershipActive { get; set; }
    public int ConversionTimeout { get; set; }
    public byte[] FileStorage { get; set; }
}

При использовании приведенного ниже кода для сериализации класса я получаю пустой файл.

var Web2PDF = new Web2PdfClient
                          {                                
                              CUrl = "http://www.google.com",
                              FileName = "test.txt"
                          };
        using (var file = File.Create(@"C:\Users\Administrator\Projects\temp\test.bin"))
        {
            Serializer.Serialize(file, Web2PDF);

        }

1 Ответ

6 голосов
/ 24 мая 2011

На самом деле, я довольно удивлен, что не бросил исключения - я буду расследовать! Чтобы это работало, базовый тип должен иметь уникальный способ указать каждый из подтипов. Это можно указать с помощью атрибутов или (в v2) во время выполнения. Например:

[ProtoContract]
[Serializable]
public class Web2PdfClient : Web2PdfEntity
{

}

[ProtoContract]
[ProtoInclude(7, typeof(Web2PdfClient))]
[Serializable]
public class Web2PdfEntity : EngineEntity
{ ... }

В 7 нет ничего особенного, кроме того, что он не должен вступать в конфликт с любыми другими элементами, определенными для этого типа. Можно определить несколько подтипов (с разными тегами). Также обратите внимание, что protobuf-net не смотрит на [Serializable], поэтому вам это не нужно, если вы не используете BinaryFormatter (или аналогичный).

Аналогично, EngineEntity должен рекламировать его ожидаемые подтипы и должен указывать элементы для сериализации (и против какого тега).

...