我使用了支持.net core和.net framework(.net standard(的第三方nuget包。
我的项目是一个 .net Framework 4.62 项目,当我使用该第三方时,我收到了来自XmlSerializer
的异常。
问题是由于房产中的私人获取者造成的。
只能序列化公共属性和字段。属性必须具有公共访问器(get 和 set 方法(。如果需要序列化非公共数据,请使用 BinaryFormatter 类而不是 XML 序列化。
完整来源
收到该错误后,我尝试打开一个 .net core 2.2 项目,使用相同的第三方 nuget,并看到相同的代码在那里工作。
他是重现该问题的代码的一个小示例:
public class Test
{
public string TestProp { private get; set; }
}
// Exception on .net 462 and works on .net core 2.2
var serializer = XmlSerializer.FromTypes(new[] { typeof(Test) });
那么,这是 .net 核心实现上的错误还是功能上的错误? 我能做些什么来在 .net 框架上支持它,而无需分叉存储库并修复代码?
这里的"错误"是它在不同的时间失败; 在net462上,它在FromTypes
期间失败; 在netcoreapp2.2
和netcoreapp3.0
上,它在Serialize
期间失败,具有:
System.InvalidOperationException: 生成 XML 文档时出错。 ---> System.MethodAccessException:尝试通过方法"Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterTest.Write2_Test(System.String, System.String, Test, Boolean, Boolean("访问方法"Test.get_TestProp(("失败
所以。。。这真的不值得担心,IMO。没有真正的功能差异,我的意思是:无论哪种方式,它都不会起作用。所以只是...别这样?
但是:如果你真的愿意,你可以把它记录在github上作为一个错误,甚至可以提交一个PR,以便它更早地失败。
也就是说:如果您添加:
public bool ShouldSerializeTestProp() => false;
然后它实际上适用于netcoreapp2.2
和netcoreapp3.0
,这是...我猜不错吗?甚至可以被认为是不改变新行为的理由。