0

我知道你不能使用接口进行序列化/反序列化,但我对我看到的行为感到困惑。

当我反序列化并转换回接口时,一些属性为空。但是,如果我转换回具体类型,相同的属性是否有值?

因此,鉴于此 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!

Page 类型公开了接口 Categories 属性和一个非接口属性——我假设可以解决序列化接口问题。

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

这是因为接口属性没有公开设置器吗?

4

1 回答 1

1

不,问题是和不支持逆变是一个很好的参考。List<T>IList<T>


看看这个简单的代码:

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>将始终为空。虽然Categories as IList<Category>会好的。

与序列化无关

于 2012-04-11T15:38:09.590 回答