Как сериализовать интерфейсные элементы с помощью protobuf .NET? - PullRequest
3 голосов
/ 23 июня 2010

Следующий тест не пройден с этой ошибкой:

"System.InvalidOperationException: Не найдено подходящей кодировки IB по умолчанию."

[ProtoContract]
public class A
{
    [ProtoMember(1)]
    public IB B { get; set; }
}

public interface IB
{
}

[ProtoContract]
public class B : IB
{
    [ProtoMember(1)]
    public int SomeProperty { get; set; }
}

[TestFixture]
public class TestFixture
{
    [Test]
    public void Test()
    {
        var a = new A {B = new B()};
        using (var m = new MemoryStream())
        {
            Serializer.Serialize(m, a);
        }
    }
}

Я использую этореализация Protobuf.net:

http://code.google.com/p/protobuf-net/

Я что-то пропустил?Большое спасибо.

1 Ответ

1 голос
/ 23 июня 2010

Это общая особенность сериализаторов на основе контракта, включая XmlSerializer и т. Д. (Т. Е. Те, которые не включают метаданные типа для каждого объекта).

Есть несколько вещей, которые делают это сложно:

  • во время десериализации, какой тип он создаст для A.B?
  • во время сериализации, «что является текущим объектом», имеет мало отношения к контракту
    • в частности, становится очень грязно, если тип реализует несколько интерфейсов

Это сценарий, для которого я хочу, чтобы что-то работало в "v2" (но, возможно, не совсем для релиза); Я думаю:

  • либо A.B должен быть ненулевым для начала (т. Е. A определяет тип A.B), либо где-то должна быть указана реализация по умолчанию
  • интерфейс на основе взаимоисключающих и наследуемых; при использовании интерфейсов не может быть поддержки наследования
  • все использование интерфейса будет осуществляться через свойства, а не поля (очевидно)

В качестве альтернативы и, возможно, более подходящего для представленного сценария, мы могли бы использовать что-то вроде [ProtoInclude] для указания конкретных типов.

Но в этих пределах я думаю, что что-то возможно. Но не сегодня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...