代码之家  ›  专栏  ›  技术社区  ›  Amir Popovich

XmlSerializer的行为与.NET框架和.NET核心上属性的私有getter不同

  •  1
  • Amir Popovich  · 技术社区  · 5 年前

    我使用了支持.NET Core和.NET Framework(.NET Standard)的第三方NuGet包。

    我的项目是一个.NETFramework4.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核心实现上的一个bug还是一个特性? 我能做些什么来支持.NETFramework而不放弃回购和修复代码吗?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Marc Gravell    5 年前

    这里的“bug”是它在不同的时间失败;在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()”失败

    所以…这真的不值得担心,我不知道 特征 区别,我的意思是:它不会 工作 不管怎样。所以…别那么做?

    但是:如果你真的想的话,你可以把它作为一个bug记录在github上,甚至提交一个pr,这样它就可以更早地失败。

    上面说:如果你加上:

    public bool ShouldSerializeTestProp() => false;
    

    然后它 会起作用的 NetCoreApp2.2版 NetCoreApp3.0 ,这是……我想不错吧?甚至可以被认为是一个原因 改变新的行为。