【问题标题】:XmlSerializer behaves different with a property's private getter on .net framework and .net coreXmlSerializer 在 .net 框架和 .net 核心上的行为与属性的私有 getter 不同
【发布时间】:2019-10-17 08:19:08
【问题描述】:

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

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

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

只有公共属性和字段可以序列化。属性必须具有公共访问器(get 和 set 方法)。如果您需要序列化非公共数据,请使用 BinaryFormatter 类而不是 XML 序列化。

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 框架上支持这一点,而无需分叉 repo 和修复代码?

【问题讨论】:

    标签: c# .net xmlserializer


    【解决方案1】:

    这里的“错误”是它在不同的时间失败;在 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。没有真正的功能 区别,我的意思是:它不会工作 任何一种方式。所以就……不要那样做?

    但是:如果你真的想的话,你可以把它作为一个 bug 记录在 github 上,甚至可以提交一个 PR 让它早点失败。

    也就是说:如果你添加:

    public bool ShouldSerializeTestProp() => false;
    

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

    【讨论】:

    • 第三方 nuget 适用于 .netcore 2.2,因为它仅使用 Deserialize 方法。我在问题中使用的示例只是为了重现问题。似乎.net框架XmlSerializer实现在尝试为该类型创建序列化程序时为序列化和反序列化加载了某种属性信息缓存,而.net核心实现推迟了这一点。似乎我需要提交PR或 fork 第三方来支持这一点。谢谢。
    猜你喜欢
    • 2021-01-09
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2019-04-16
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多