Фон
Я пытаюсь заставить приведенный ниже класс сериализовать и десериализовать класс, который реализует абстрактный класс, используя Protobuf-net а>. Однако при десериализации происходит сбой с ошибкой: «Для AbstractTest не найден конструктор без параметров».
Что я делаю неправильно?
Что я пробовал
Я потратил много времени на поиск ответа, но очень немногие вопросы связаны с абстрактным характером моего вопроса.
Минимальный пример
public class TestRunner
{
public void Go()
{
string encoded = Serialize<ConcreteTest>(new ConcreteTest());
object ob = Deserialize(new System.IO.MemoryStream(Encoding.ASCII.GetBytes(encoded)));
}
public static string Serialize<T>(T data)
{
MemoryStream outputStream = new MemoryStream();
Serializer.Serialize<T>(outputStream, data);
outputStream.Position = 0;
StreamReader outputReader = new StreamReader(outputStream);
return outputReader.ReadToEnd();
}
public static object Deserialize(Stream data)
{
AbstractTest test = Serializer.Deserialize<AbstractTest>(data);
//Error from the line above: No parameterless constructor found for AbstractTest
if (test.ID == 3)
{
return Serializer.Deserialize<ConcreteTest>(data);
}
throw new Exception("We don't know how to handle the message type if I got here!");
}
}
[ProtoBuf.ProtoContract]
[ProtoBuf.ProtoInclude(25, typeof(ConcreteTest))]
public abstract class AbstractTest
{
public AbstractTest()
{
}
[ProtoBuf.ProtoMember(1)]
public int ID = 3;
public abstract void Test();
}
[ProtoBuf.ProtoContract]
public class ConcreteTest : AbstractTest
{
[ProtoBuf.ProtoMember(2)]
public int ID2 = 4;
public override void Test()
{
MasterLog.DebugWriteLine("It worked!");
}
}