1
[ProtoContract]
public abstract class Animal
{
    [ProtoMember(1)]
    public abstract string Type { get; set; }
    [ProtoMember(2)]
    public string Name { get; set; }
    [ProtoMember(3)]
    public int Likeability { get; set; }
}

public class Cat : Animal
{
    public override string Type { get; set; }
    public int Friendliness { get; set; }

    public override string ToString()
    {
        return String.Format("Type : {0}, Name : {1}, Likeability : {2}, Friendliness : {3}", Type, Name, Likeability, Friendliness);
    }
}

ユースケースすなわち

var animal = new Cat() { Name = "Whiskers", Friendliness = 10 , Type = "cat", Likeability = 5};
var model = TypeModel.Create();
model[typeof(Animal)].AddSubType(4, typeof(Cat));
model[typeof(Cat)].AddField(1, "Friendliness");
var typeModel = model.Compile();

var memoryStream = new MemoryStream();
typeModel.Serialize(memoryStream, animal);

var deserializedCat = new Cat() { Name = "PusPus" };
memoryStream.Seek(0, SeekOrigin.Begin);
var deserializedCat1 = typeModel.Deserialize(memoryStream, deserializedCat, typeof(Cat));
Console.WriteLine("deserializedCat : hash : " + deserializedCat.GetHashCode() + "\n" + deserializedCat);
Console.WriteLine("deserializedCat1 : hash : " + deserializedCat1.GetHashCode() + "\n" + deserializedCat1);

上記のユースケースは、再利用可能なランタイムシリアライゼーションに対して正しいですか、それとも「動物」を無視して「猫」を明示的にマップする必要がありますか?また、「ComplileInPlace」に関して少し混乱しています Compile とはどう違うのですか?

4

1 に答える 1

2

実行時のマッピングに関しては、問題ないようです。期待どおりに機能しますか?つまり、猫を取り戻しますか?AnimalCatメンバーの両方?

Compile*メソッドの違い:

  • CompileInPlace()今後の呼び出しでシリアル化された形式が使用されるように、既存のモデルを作成します。model.Serialize(...)通常、これは各タイプが最初に必要になったときに自動的に行われますが、これにより事前に準備することができます。「インプレース」アプローチには追加の機能もあります-プライベートメンバーにアクセスでき、パフォーマンスを微調整するための追加のスタックトリックを実行できます-ただし、すべてのプラットフォームで利用できるわけではありません
  • Compile(string,string)モデルを個別の dll ファイルにコンパイルできます。このファイルは、完全に静的なシリアル化のために参照および使用できます (つまり、実行時に反映されません)。
  • Compile()そのようTypeModelことをしますが、別のdllファイルなしで、モデルからビルドされたインスタンスを作成します

ほとんどの場合、CompileInPlace()必要なときに自動的にその場でコンパイルされるため、何もする必要はありませんが、目的は次のとおりです。

于 2012-06-18T07:12:38.957 に答える