C#中的序列化

din*_*esh 3 c# windows-phone-7

我对序列化有疑问.

例:

interface IBase {}

[DataContract]
class Base : IBase
{
  [DataContract]
  public Derived Child{get;set;}
}

[DataContract]
[KnownType(typeof(Base))]
class Derived : Base
{
  [DataMember]
  public IBase Parrent {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试存储Base类的实例IsolatedStorage,它就不会被执行; 它挂了.有没有办法做到这一点?

Mar*_*ell 5

嗯,你的属性到处都是 - Base.Child是一个[DataMember],而不是一个[DataContract].在电话7中的IIRC,您需要公共类型进行序列化; 它是需要通知儿童基地.然而; 这是另一个问题; 这不是指定为合同.如果可能,将其更改为(不),因为序列化程序需要了解所有具体合同.IBaseBaseIBase

所以:

public interface IBase {}

[DataContract]
[KnownType(typeof(Derived))]
public class Base : IBase
{
    [DataMember]
    public Derived Child{get;set;}
}

[DataContract]
public class Derived : Base
{
    [DataMember]
    public Base Parent {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

此外,Parent成员是树序列化程序的一个大问题(并且DataContractSerializer 树序列化程序,除非您明确启用全图模式).

或许可以让DCS喜欢IBase,但您需要调查将其标记为合同并注明具体类型.如果你无法在任何地方获得,我知道protobuf-net支持这种布局(虽然我没有专门为手机7 测试过,但没有根本原因它无法工作).

  • 只是为了确认,是的,您只能在Windows Phone上序列化公共类型. (3认同)