【问题标题】:Mixing custom and basic serialization?混合自定义和基本序列化?
【发布时间】:2009-03-13 05:55:10
【问题描述】:

我有一个具有 100 多个属性的类(它是一个数据库映射类),其中一个属性必须在方法中。换句话说,这些数据不是通过属性而是通过方法公开的:

"ABCType GetABC(), SetABC(ABCType 值)"

这一切都非常不像 C#。我一看到就发抖。

该类需要可序列化,以便可以通过 Web 服务发送,Get/Set 方法公开的数据也需要序列化。 (它在一个方法中,因为我使用的网格对反射做了一件奇怪的事情;它无法处理包含与包含对象相同类型的属性的对象。问题属性将数据库对象的原始状态存储在如果需要还原。是的,实施效率低下 - 但我无法重新设计它。)

我的问题是这样的:因为只有这 1 个字段需要自定义序列化代码,所以我想只在调用 GetABC 和 SetABC 时使用自定义序列化,为类的其余部分恢复为基本的 XML 序列化。它将最大限度地减少我的序列化代码中出现错误的可能性。有什么办法吗?

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:

    我要尝试的第一件事是添加一个用于序列化的属性,但在 UI 中隐藏它:

    [Browsable(false)] // hide in UI
    public SomeType ABC {
        get {return GetABC();}
        set {SetABC(value);}
    }
    

    不幸的是,你不能真正混合和匹配序列化;一旦你实现了IXmlSerializable,你就拥有了一切。如果您使用的是 WCF,那么DataContractSerialier 支持序列化的非公共属性,因此您可以使用:

    [DataMember]
    private SomeType ABC {
        get {return GetABC();}
        set {SetABC(value);}
    }
    

    但这不适用于XmlSerializer 的“asmx”网络服务。

    [Browsable] 技巧是否有效?假设自定义网格使用TypeDescriptor,另一种选择可能是通过ICustomTypeDescriptor 隐藏它,但这只是为了隐藏一个属性需要做很多工作......

    【讨论】:

    • [Browsable] 技巧不起作用,因为它不会隐藏网格对 typeof(SomeType).GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) 的调用的属性;但是您确实回答了有关混合序列化的问题,所以谢谢!
    猜你喜欢
    • 2012-11-29
    • 2016-10-28
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多