【问题标题】:Ignore some properties in runtime when using DataContractSerializer使用 DataContractSerializer 时忽略运行时的一些属性
【发布时间】:2012-05-18 17:29:00
【问题描述】:

我正在使用 DataContractSerializer 使用 DataMember 属性将对象序列化为 XML(仅对公共属性进行序列化)。
是否可以动态忽略某些属性,以便它们不会包含在 XML 输出中?

例如,允许用户在某个列表控件中选择所需的 xml 元素,然后仅序列化用户选择的那些元素,不包括所有未选择的元素。

谢谢

【问题讨论】:

    标签: .net serialization datacontractserializer


    【解决方案1】:

    对于列表场景,可能只是有不同的属性,所以不是:

    [DataMember]
    public List<Whatever> Items {get {...}}
    

    你有:

    public List<Whatever> Items {get {...}}
    
    [DataMember]
    public List<Whatever> SelectedItems {
       get { return Items.FindAll(x => x.IsSelected); }
    

    但是,反序列化会很痛苦,因为您的列表需要输入到 Items 中;如果你也需要反序列化,你可能需要编写一个复杂的自定义列表。


    作为第二个想法;只需使用您要序列化的项目创建对象的第二个实例;非常简单有效:

    var dto = new YourType { X = orig.X, Y = orig.Y, ... };
    foreach(var item in orig.Items) {
        if(orig.Items.IsSelected) dto.Items.Add(item);
    }
    // now serialize `dto`
    

    AFAIK,DataContractSerializer 不支持成员的条件序列化。

    个人财产级别,如果您使用XmlSerializer,则此一个选项,但是 - 对于财产,例如Foo,您只需添加:

    public bool ShouldSerializeFoo() {
        // return true to serialize, false to ignore
    }
    

    或:

    [XmlIgnore]
    public bool FooSpecified {
        get { /* return true to serialize, false to ignore */ }
        set { /* is passed true if found in the content */ }
    }
    

    这些仅作为基于名称的约定应用。

    【讨论】:

    • 谢谢,马克。例如,如果我有一个 List 的实例,其中 MyClass 具有三个属性 X、Y 和 Z,是否可以仅包含属性 X 和 Y 并忽略列表中每个项目的 Z,然后发送此列表到 DataContractSerializer 和序列化程序将在输出中仅包含 X 和 Y 而忽略 Z?我只想为列表中的每个项目排除一些属性。您在上面指定的一些选项是否可以实现?
    • 在想序列化XY而不是Z的情况下; DCS 仅在适用于所有项目时才可用(据我所知),即通过适当地选择[DataMember][IgnoreDataMember];据我所知,DCS 没有条件序列化
    【解决方案2】:

    【讨论】:

    • 那是编译时,不是运行时,不能应用于单个列表项。
    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多