0
genericと継承を含むより複雑な階層を使用する場合、protobuf-netを使用して逆シリアル化を実行する際に問題が発生します。genericタイプのprotobuf-net継承
タイプ階層を動的に定義する方法を教えてください。
興味深いのは、直列化が正常に動作していることですが、直列化復元は、メッセージと例外で失敗:「のためのシリアライザを用意することができませんでした:Serialization.command.ICommand」
コードIを怒鳴る参照してください。私は以下を使用しています:
[ProtoContract]
public abstract class AbstractEntity
{
public AbstractEntity()
{
}
protected AbstractEntity(int integer)
{
this.integer = integer;
}
private int noSerializable = 0;
[ProtoMember(1)]
public int NoSerializable { get { return noSerializable; }
set { noSerializable=value; }
}
}
[ProtoContract]
public class Entity:AbstractEntity
{
public Entity() : base()
{
}
public Entity(int integer) : base(integer)
{
}
[ProtoMember(2)]
public String Name { get; set; }
[ProtoMember(3)]
public String Surname { get; set; }
[ProtoMember(4)]
public int Age { get; set; }
}
[ProtoContract]
public interface ICommand
{
void Execute();
}
[ProtoContract]
public abstract class AbstractCommand: ICommand
{
public abstract void someAbstractMet();
public void Execute()
{
}
}
[ProtoContract]
public class AbstractEntityCommand<T>:AbstractCommand where T:AbstractEntity
{
[ProtoMember(1)]
public T Entity { set; get; }
public AbstractEntityCommand()
{
}
public AbstractEntityCommand(T entity)
{
Entity = entity;
}
public override void someAbstractMet()
{
}
}
[ProtoContract]
public class UpdateEntityCommand<T>:AbstractEntityCommand<T> where T:AbstractEntity
{
public UpdateEntityCommand()
{
}
public UpdateEntityCommand(T entity):base(entity)
{
}
public override void someAbstractMet()
{
}
}
class Program
{
static void Main(string[] args)
{
var entity = new Entity(4);
Console.WriteLine("Using Protobuf");
//first define dinamicaly the hierarchy - see ProtoInclude attribute
RuntimeTypeModel.Default.Add(typeof (AbstractEntity), true).AddSubType(7, typeof (Entity));
AbstractEntity absEnt = entity;
bites = absEnt.ProtoBufSerialize();
thirdEntity = (Entity)bites.ProtoBufDeserialize<AbstractEntity>();
Console.WriteLine("Name=" + thirdEntity.Name + " Surname=" + thirdEntity.Surname + " Age=" + thirdEntity.Age + " integer=" + thirdEntity.TheInt + " No serializable field = " + thirdEntity.NoSerializable);
// Console.ReadKey();
Console.WriteLine("Test for generics");
RuntimeTypeModel.Default.Add(typeof(ICommand), true).AddSubType(70, typeof(AbstractCommand));
RuntimeTypeModel.Default.Add(typeof(ICommand), true).AddSubType(80, typeof(AbstractEntityCommand<>));
RuntimeTypeModel.Default.Add(typeof(ICommand), true).AddSubType(90, typeof(UpdateEntityCommand<>));
ICommand genCommand = new UpdateEntityCommand<Entity>(entity);
bites = genCommand.ProtoBufSerialize();
var concreteCmd = bites.ProtoBufDeserialize<UpdateEntityCommand<Entity>>();
var unknownCmd = bites.ProtoBufDeserialize<ICommand>();
Console.ReadKey();
}
すべては、ICommandを逆シリアル化しようとするまでうまくいきます。
私はここで何が欠けていますか?
残念ながら、これは動作しません。ルートが抽象クラスであっても、動作は同じです。他のアイデア? –