Xml序列化和接口

时间:2012-04-11 15:33:14

标签: c# xml c#-4.0 serialization interface

我知道您无法使用界面序列化/反序列化,但我对我看到的行为感到困惑。

当我反序列化并转换回接口时,某些属性为null。但是如果我回到具体类型,那么同一个属性有一个值?

所以,鉴于这个XML(为简洁起见缩短):

<Page>
  <ComponentPresentations>
    <ComponentPresentation>
      <Component>
        <Categories>
          <Category>
            <Id>tcm:35-540-512</Id>

使用

进行反序列化
var serializer = new XmlSerializer(typeof(Page));
page = (IPage)serializer.Deserialize(reader);

page.ComponentPresentations[0].Component.Categories <-- is null

但是如果我回到类型,

var serializer = new XmlSerializer(typeof(Page));
page = (Page)serializer.Deserialize(reader);

page.ComponentPresentations[0].Component.Categories <-- is not null!

页面类型公开接口Categories属性和非接口属性 - 我假设绕过序列化接口问题。

public List<Category> Categories { get; set; }
[XmlIgnore]
IList<ICategory> IComponent.Categories
{
    get { return Categories as IList<ICategory>; }
}

这是因为interface属性没有公开setter吗?

1 个答案:

答案 0 :(得分:1)

没有。 List<T>IList<T>不支持 Contravariance Here是一个很好的参考。


看看这个简单的代码:

public interface IMyInterface
{

}

public class MyImplementation : IMyInterface
{

}

List<MyImplementation> myImplementations = new List<MyImplementation>();
Console.WriteLine(myImplementations as IList<IMyInterface> == null); // OUTPUT: true!!

正如您所看到的,Categories as IList<ICategory>将始终为null。虽然Categories as IList<Category>可以。

与序列化无关