Почему мой List не сериализуется с protobuf-net?

[DataContract] public class Foo 
{
   [DataMember(Order = 1)] public int FooId { get; set; }
}

[DataContract] public class Bar : Foo 
{
   [DataMember(Order = 2)] public string Name { get; set; }
}

[DataContract] public class Baz : Bar
{
    [DataMember(Order = 3)] public string BazName { get; set; }
}

Затем в коде я устанавливаю новую TypeModel и добавляю свои подтипы

_ProtobufSerializer = TypeModel.Create();
_ProtobufSerializer.Add(typeof(Bar), true);
_ProtobufSerializer.Add(typeof(Baz), true);
var type = _ProtobufSerializer.Add(typeof(Foo), true);
type.AddSubType(100, typeof(Bar));
type.AddSubType(101, typeof(Baz));

Теперь я могу сериализовать экземпляры Foo, Bar и Baz в порядке. Если я сериализую

var listThatWorks = new List<Foo> { new Foo { FooId = 12 } }
var anotherListThatWorks = new List<Foo> { new Bar { FooId = 12, Name = "Test" } }

, это отлично работает. Однако, если я сериализую

var fails = new List<Foo> { new Baz { FooId = 12, Name = "Test" } }

, я получаю InvalidOperationException с сообщением «Неожиданный подтип: Baz». Что я делаю неправильно? Это просто плохая идея использовать подтипы с protobuf-net?

Также спасибо @BFree за помощь в понимании того, что это связано с наличием двух уровней подклассов.

5
задан AgileJon 29 March 2012 в 15:35
поделиться