【发布时间】:2017-06-14 13:05:12
【问题描述】:
我有一个在 .NETFramework 4.6.1 上运行的应用程序,对抽象类和继承类型使用 xml 序列化,方法与 XML Serialization and Inherited Types 几乎相同,而且效果很好。但是在将应用程序移植到 UWP .NETCore 之后,我遇到了一个奇怪的异常。这是一个重现它的简单示例。
public class ClassToSerialize
{
[XmlElement(Type = typeof(CustomSerializer<AnotherOne>))]
public AnotherOne anotherOne;
public ClassToSerialize()
{
}
}
public abstract class AnotherOne
{
public AnotherOne()
{
}
}
public class CustomSerializer<TType> : IXmlSerializable
{
public CustomSerializer()
{
}
public CustomSerializer(TType data)
{
m_data = data;
}
public static implicit operator CustomSerializer<TType>(TType data)
{
return data == null ? null : new CustomSerializer<TType>(data);
}
public static implicit operator TType(CustomSerializer<TType> obj)
{
return obj.m_data;
}
private TType m_data;
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
}
public void WriteXml(XmlWriter writer)
{
}
}
并为此类型创建 XmlSerializer
XmlSerializer sr = new XmlSerializer(typeof(ClassToSerialize));
导致异常
System.InvalidOperationException: TestApp.AnotherOne, TestApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null is notassignable from TestApp.CustomSerializer`1[[TestApp.AnotherOne, TestApp, Version=1.0.0.0, Culture =neutral, PublicKeyToken=null]], TestApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
相同的代码适用于 .netframework 应用程序。他们是否更改了 .netcore 中的某些内容,还是我遗漏了什么?
【问题讨论】:
-
你在 UWP 上重新编译了吗?如果没有,那么您需要在 UWP 上发布和安装。不同版本的网络库在 windows dll 中的偏移量是不同的,因此除非网络库的版本完全相同,否则仅移动可执行文件是行不通的。
-
是的,我没有使用桥接器,而是将项目重新创建为新的通用应用程序项目并使用 .NETCore.UniversalWindowsPlatform 5.3.3 包编译。
-
我遇到了完全相同的问题。您找到解决方案了吗?
-
@wexman 是的,有点。我摆脱了属性 [XmlElement(Type = typeof(CustomSerializer
))],因为这是异常的原因,并重新设计了我的序列化系统。创建 XmlSerializer 时,您可以为序列化器提供其他类型的列表,因此使用反射我递归地收集了我想要序列化的类中的所有嵌套类型,并将它们传递给 XmlSerializer 构造函数 -
@Alex 谢谢,但恐怕这对我来说是不可能的。实际上,我现在已经在github.com/dotnet/corefx/issues/35691 上打开了一个问题,但它似乎并没有以某种方式得到解决。也许你想在那里发表评论......
标签: c# .net xml xml-serialization .net-core