J'essaie de sérialiser un message immuable qui a une classe de base immuable. Cependant, je suis incapable de convaincre protobuf-serializer de le désérialiser en un type dérivé. En bref ce test me donne une exception coulée non valide (de la base au dérivé):Protobuf-net et l'héritage des messages immuables
[TestFixture]
public class InheritanceTest
{
public class Base
{
public int IntField { get; private set; }
public Base(int intField)
{
IntField = intField;
}
}
public class Derived : Base
{
public string StringField { get; private set; }
public Derived(int intField, string stringField) : base(intField)
{
StringField = stringField;
}
}
[Test]
public void TestInheritance()
{
var serializer = TypeModel.Create();
serializer.Add(typeof (Base), true)
.Add(1, "IntField")
.AddSubType(2, typeof (Derived))
.UseConstructor = false;
serializer.Add(typeof (Derived), true)
.Add(1, "StringField")
.UseConstructor = false;
serializer.CompileInPlace();
using (var stream = new MemoryStream())
{
var message = new Derived(1, "Some text that is not important");
serializer.Serialize(stream, message);
stream.Position = 0;
var retrieved = (Derived) serializer.Deserialize(stream, null, typeof (Derived));
Assert.AreEqual(message.IntField, retrieved.IntField);
Assert.AreEqual(message.StringField, retrieved.StringField);
}
}
}
Cette exception disparaît si je convertir la base et dérivés à des types mutables. Est-ce que je fais quelque chose de mal ou est-ce une limitation de protobuf-net?
Salut, oui - changer cela à faux a aidé. La raison pour laquelle ils étaient vrais était parce que j'utilise en fait ma propre interface fluide qui définit les membres en utilisant des expressions au lieu de chaînes et je voulais conserver un comportement standard au cas où je serais obligé d'utiliser plus tard des attributs. Accepter cette réponse à la place car il est susceptible de causer moins de problèmes avec l'héritage (puisque le sous-type est connu pour le sérialiseur). –
@VytautasMackonis Fondamentalement: il frappait cette logique: http://marcgravell.blogspot.co.uk/2011/08/automatic-serialization-whats-in-tuple.html - Je vais vérifier plus tard si cela peut être évité dans le futur –