[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);
}
}
使用情況下即protobuf網運行序列
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有什麼不同?
對我來說看起來不錯,除了我不知道爲什麼你會同時使用舊的和新的方式標記屬性。我只是在我想要序列化的所有對象上使用ProtoContract和ProtoMember,還缺少Cat類的'[ProtoContract]'。不知道編譯到位。 – Joe
@Joe我認爲這裏的重點是'Cat'不是事先已知的 –