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

XmlSerializer behaves different with a property's private getter on .net framework and .net core

我使用了支持 .net 核心和 .net 框架(.net 标准)的第三方 nuget 包。

我的项目是 .net Framework 4.62 项目,当我使用该第三方时,我收到了来自 XmlSerializer 的异常。

问题是由于 属性 中的私有 getter。

Only public properties and fields can be serialized. Properties must have public accessors (get and set methods). If you need to serialize non-public data, use the BinaryFormatter class rather than XML serialization.

Full Source

收到该错误后,我尝试打开一个 .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 框架上支持它,而无需分叉回购和修复代码?

这里的"bug"是在不同的时间失败了;在 net462 上它在 FromTypes 期间失败;在 netcoreapp2.2netcoreapp3.0 上,它在 Serialize 期间失败,其中:

System.InvalidOperationException: There was an error generating the XML document. ---> System.MethodAccessException: Attempt by method 'Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterTest.Write2_Test(System.String, System.String, Test, Boolean, Boolean)' to access method 'Test.get_TestProp()' failed

所以...真的不值得担心,IMO。没有真正的 feature 区别,我的意思是:它不会 work 无论哪种方式。所以只是...不要那样做?

但是:您可以在 github 上将其记录为错误,甚至可以提交 PR 以便它更早失败,如果您真的想要的话。

也就是说:如果您添加:

public bool ShouldSerializeTestProp() => false;

那么它 将在 netcoreapp2.2netcoreapp3.0 上实际工作 ,我猜这……不错吧?甚至可以被视为 改变新行为的原因。