Коллекции Сериализации с protobuf-сетью - PullRequest
1 голос
/ 23 февраля 2012

У меня есть некоторые проблемы с сериализацией общих коллекций с помощью protobuf-net.Классы определены следующим образом:

[ProtoContract]
public class DOPerson
{
    public DOPerson() { }


    [ProtoMember(1)]
    public string FirstName { get; set; }

    [ProtoMember(2)]
    public string Surname { get; set; }
}

[ProtoContract]
public class DOPersonCollection : DOCollection<DOPerson>
{
    public DOPersonCollection() : base() { }
}

[ProtoContract]
public abstract class DOCollection<T> : BindingList<T>
{
    public DOCollection() { }

    [ProtoMember(100)]
    public Guid CollectionGuid { get; set; } 
}

Для проверки сериализации у меня есть следующая основная функция:

class Program
{
    static void Main(string[] args)
    {
        DOPerson personOne   = new DOPerson() { FirstName = "One", Surname = "Person" };
        DOPerson personTwo   = new DOPerson() { FirstName = "Two", Surname = "Person" };
        DOPerson personThree = new DOPerson() { FirstName = "Three", Surname = "Person" };

        DOPersonCollection personCollection1 = new DOPersonCollection();
        personCollection1.CollectionGuid = Guid.NewGuid();

        personCollection1.Add(personOne);
        personCollection1.Add(personTwo);
        personCollection1.Add(personThree);

        // Searialize the Collection
        MemoryStream memBuffer = new MemoryStream();
        Serializer.Serialize(memBuffer, personCollection1);

        // Deserialize the Collction
        memBuffer.Position = 0;
        DOPersonCollection personCollection2 = Serializer.Deserialize<DOPersonCollection>(memBuffer);

        Console.WriteLine(string.Format("Person Collection 1 GUID : {0}", personCollection1.CollectionGuid.ToString()));
        Console.WriteLine(string.Format("Person Collection 1 Count: {0}", personCollection1.Count));
        Console.WriteLine("");

        Console.WriteLine(string.Format("Person Collection 2 GUID : {0}", personCollection2.CollectionGuid.ToString()));
        Console.WriteLine(string.Format("Person Collection 2 Count: {0}", personCollection2.Count));
        Console.ReadLine();
    }
}

Получены следующие результаты:

ЧеловекИдентификатор GUID коллекции 1: db4ff817-db79-4588-98af-d730800add2e Счет 1 коллекции людей: 3

Идентификатор GUID коллекции 2: 00000000-0000-0000-0000-000000000000 Количество людей 2: 0

Первая сериализация создает пустой буфер, и поэтому второй раз создает и очищает объект коллекции.Есть ли механизм для правильной обработки сценариев такого рода для получения необходимых результатов сериализации?

1 Ответ

0 голосов
/ 24 февраля 2012

В настоящее время объект является или коллекцией или объектом данных. В спецификации raw protobuf нет места для наложения. Мой совет: если вам нужно хранить другие данные, вы должны инкапсулировать коллекцию, а не injerit one, т.е. вместо:

  • YourType: SomeCollection
    • SomeDataMember

Иметь:

  • YourType
    • Предметы (какой-то список)
    • SomeDataMember

Что будет хорошо работать.

Там является неспособностью подавить обработку списка (и вместо этого использовать обработку членов), но: мой совет остается инкапсулированным, а не наследуемым Тогда все должно работать нормально.

...