Как можно указать protobuf-net, что свойство интерфейса должно быть десериализовано как определенный конкретный тип?

#.net #protobuf-net

#.net #protobuf-net

Вопрос:

У меня есть это свойство:

 public class SomeClass
{
  public ISomeInterface SomeProperty { get;set; }
}
  

Теперь, ISomeInterface в этом конкретном контексте может быть только определенный конкретный тип, например SomeClass2 . Могу ли я сделать это без атрибута ProtoInclude?

Я думал, что смогу сделать что-то вроде этого:

 model.Add(typeof(SomeClass), true).Add(1, "SomeProperty", typeof(SomeClass2));
  

Указание на то, что SomeProperty это всегда должно быть десериализовано как SomeClass2 (что, конечно, реализует интерфейс).

Но мне не удалось найти подобный метод в модели.

Комментарии:

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

Ответ №1:

Вы хотите меня протестировать; p

Это не было открыто напрямую; Google на данный момент не разрешает мне фиксировать, но следующее сработает, как только я смогу зафиксировать:

 [Test]
public void ExposeInterfaceWithDefaultImplementation()
{
    var model = TypeModel.Create();
    // note the following sets for the ConstructType for the ISomeInferface, not specifically for Foo
    model.Add(typeof(ISomeInterface), false).Add("Foo").ConstructType = typeof(SomeClass2);
    model.Add(typeof(SomeClass), false).Add("SomeProperty");

    var orig = new SomeClass();
    orig.SomeProperty = new SomeClass2();
    orig.SomeProperty.Foo = 123;
    var clone = (SomeClass)model.DeepClone(orig);
    Assert.AreEqual(123, clone.SomeProperty.Foo);
}
  

Комментарии:

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

2. Я не понял последнего утверждения, в частности «и значение равно null». Что, если значение не равно null? Как десериализатор узнает, какой тип создавать из потока, если ни ProtoInclude, ни dynamicType не использовались?

3. Существует ли концептуальная проблема с разрешением спецификации каждого свойства типа реализации интерфейса по умолчанию? Все, что я хочу, это чтобы при сериализации свойства обрабатывался фактический тип, а при десериализации создавался экземпляр конкретного конкретного типа.