我知道您无法使用界面序列化/反序列化,但我对我看到的行为感到困惑。
当我反序列化并转换回接口时,某些属性为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吗?
答案 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>
可以。
与序列化无关。