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);

上述用例对于可重用的运行时序列化是否正确,或者是否应该显式映射“Cat”而忽略“Animal”并且有点困惑“ComplileInPlace”与 Compile 有何不同?

4

1 回答 1

2

就运行时的映射而言,这看起来不错。它是否按预期工作?即你有一只猫回来吗?和Animal成员Cat

方法的区别Compile*

  • CompileInPlace() makes the existing model, such that future calls to model.Serialize(...) will use the serialized form. Normally this is automatic anyway the first time each type is required, but this allows it to be prepared ahead of time; the "in place" approach also has extra features - it can access private members, and it can do extra stack tricks for small performance tweaks - but it is not available on all platforms
  • Compile(string,string) allows you to compile the model to a separate dll file, which can be referenced and used for fully-static serialization (i.e. no reflection at runtime)
  • Compile() does something like that, but creates an instance of a TypeModel built from the model, without a separate dll file

In most cases, CompileInPlace() is what you are after - although you don't need to do anything at all, since it will usually automatically compile-in-place when needed

于 2012-06-18T07:12:38.957 回答