我们正在使用xsd.exe生成的代码创建一个包来反序列化某些XML文件。一些“虽然”:
- 我们正在使用Xamarin(iOS和Android)使用Visual Studio for Mac 2017。
- 我们正在使用带有核心(PCL),平台和共享代码项目的MvvmCross-setup,但MvvmCross没有涉及此问题。
- xsd.exe生成的代码位于共享代码项目中。
- 由于我们希望能够在core / PCL中使用反序列化对象,我们从xsd.exe生成的类型中提取接口,并让生成的类型实现这些接口。
- 为了完成这项工作,反序列化程序使用的所有属性都使用
[XmlElement(Type = <concrete-type>)]
进行了注释,因为属性本身现在是接口。
在平台上使用此构造时,这很好用。
但是,在NUnit项目中使用它时,我们得到一个例外:
System.NotSupportedException:无法序列化成员&lt; concrete-type&gt;类型&lt; interface-type&gt;因为它是一个界面。
好像[XmlElement]
- 属性不在那里。
到目前为止我们无法找到原因并希望在这里找到智慧:-)所以有人知道,为什么会发生这种情况和/或我们如何解决它?
顺便说一下:如果有更简单或更好的方法可以使用PCL代码进行XML反序列化,请告诉我。
其他信息
- 在编译之前,共享代码项目中的代码文件被“复制”到引用共享代码项目的项目中。因此,引用项目编译共享代码,就好像它是自己的代码一样。
- NUnit项目编译为一个库,它实际上是平台代码,并且可以使用所有.NET。通过引用包含具体类型的共享代码项目,这些项目被编译为好像它们是测试项目的一部分。
- 检测到引用的System.Xml版本的差异:
- iOS项目:Xamarin.iOS的System.Xml v2.0.5.0
- Android项目:Xamarin.Android的System.Xml v2.0.5.0
- NUnit-project:.NET Framework v4.6.1的System.Xml v4.0.0.0