XmlSerializer 在 .net 框架和 .net core 上与属性的私有 getter 的行为不同



我使用了支持.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.2netcoreapp3.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.2netcoreapp3.0,这是...我猜不错吗?甚至可以被认为是改变新行为的理由。

最新更新