public interface IYObject
{
string X { get; }
}
public class YObject : IYObject
{
public string X { get; set; }
}
public class D
{
public IYObject Y { get; set; }
}
class Program
{
static void Main()
{
var m = RuntimeTypeModel.Default;
m.Add(typeof(D), true).Add("Y");
m.Add(typeof(IYObject), false).AddSubType(1, typeof(YObject)).Add("X");
var d = new D { Y = new YObject { X = "a" } };
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, d);
ms.Position = 0;
var d2 = Serializer.Deserialize<D>(ms);
Debug.Assert(d.Y.X == d2.Y.X);
}
}
}当我尝试向IYObject添加子类型时,代码失败
System.InvalidOperationException occurred
Message=Sub-types can only be adedd to non-sealed classes
Source=protobuf-net
StackTrace:
at ProtoBuf.Meta.MetaType.AddSubType(Int32 fieldNumber, Type derivedType)
InnerException: 发布于 2011-05-25 07:41:30
在大约2分钟前,这是非法的,因为接口不支持已知类型。
现在,这种使用是非法的,因为它不能安全地序列化IYObject.X,因为它没有setter。但是,只要我们将自己限制到可以合理序列化的接口成员,或者具体类型的成员,这现在就被提交了。使用属性或类型模型。See here for the scenarios that are now available (通过代码或下一个public drop)。
https://stackoverflow.com/questions/6115986
复制相似问题