【问题标题】:Error serializing inherited property in .NET 4.5在 .NET 4.5 中序列化继承属性时出错
【发布时间】:2013-03-15 01:58:29
【问题描述】:

这是一个后续问题:

Serialization breaks in .NET 4.5

我在遗留代码中有一个属性,这让我在 .NET 4.5 上的序列化过程中感到悲痛。

这是属性:

 [EditorBrowsable(EditorBrowsableState.Never), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    private new object Value
    {
        get
        {
            return base.Value;
        }
        set
        {
            base.Value = value;
        }
    }

这可能是为了隐藏基类的“Value”属性而引入的。 到目前为止唯一有效的解决方案是 让序列化程序知道我想在 .NET4 中序列化。 但这对我来说是个问题。 (只有在traget计算机上安装了.NET 4.5才应该设置此配置,否则会引发异常)。

我想我可以一起删除该属性,但由于我正在处理一个庞大而复杂的遗留系统,我不确定可能会产生什么副作用。

所以我的问题是双重的:

  1. 为什么继承的属性会破坏 .NET 4.5 序列化?

  2. 如果我删除了继承的属性,我应该期待什么讨厌的副作用?

【问题讨论】:

    标签: c# .net serialization


    【解决方案1】:

    正如优素福在related post 上的回答:

    在 4.5 中,XmlSerializer 的实现被替换为不依赖于 C# 编译器的实现。虽然它提供了更好的启动性能和稳定性,但您可能会遇到实现之间的兼容性问题。

    使用 legacySerializer 的配置设置在 4.0 机器上不起作用,因为相应的强类型 Xml 配置节类不包含此设置的占位符。

    这两个问题都将在即将到来的更新中得到解决。在此之前,您可以通过在 4.5 中设置配置开关来解决此问题,并移除 4.0 上的开关。

    【讨论】:

    • 谢谢。如果我将编译类型更改为 4.5,这会起作用吗?因为在那种情况下,遗留序列化的标志将无济于事,因为这是在 4.5 no 4.0 中编译的
    • 如果您在 4.5 运行时上运行 4.5/4.0 目标应用程序,此开关效果很好。但如果您在纯 4.0 机器上运行 4.0 目标应用程序,则切换失败。但是,如果您在纯 4.0 运行时上运行应用程序,则不需要此配置开关,因为您的反序列化器在这里已经可以正常工作。因此,您只需要根据您的机器的运行时有条件地进行此配置切换。
    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 2012-12-01
    • 2015-09-14
    • 1970-01-01
    • 2021-12-09
    • 2012-02-15
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多