.net - 使用 DataContractSerializer 时忽略运行时的某些属性

标签 .net serialization datacontractserializer

我正在使用 DataContractSerializer 使用 DataMember 属性将对象序列化为 XML(仅对公共(public)属性进行序列化)。
是否可以动态忽略某些属性,以便它们不会包含在 XML 输出中?
例如,允许用户在某个列表控件中选择所需的 xml 元素,然后仅序列化用户选择的那些元素,不包括所有未选择的元素。

谢谢

最佳答案

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

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

你有:
public List<Whatever> Items {get {...}}

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

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

作为第二个想法;只需使用 创建对象的第二个实例只是您要序列化的项目;非常简单有效:
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`

阿法克,DataContractSerializer不支持成员的条件序列化。

个人属性(property) 级别,如果您使用 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 */ }
}

这些纯粹是作为基于名称的约定应用的。

关于.net - 使用 DataContractSerializer 时忽略运行时的某些属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10528967/

相关文章:

c# - 将程序集嵌入另一个程序集

c# - 必须声明标量变量 “@Login” 。尝试向 SqlDataSource 添加参数时出错

c++ - 计算Qt中对象的序列化大小

php - 一个多维数组与具有连接行的多个表

c# - 具有长属性名称的 WCF DataContractSerializer 性能

c# - 如何使用 DataContractSerializer 反序列化 XML

c# - 找不到使用 System.Web.UI.HtmlControls 命名空间

c# - 如何在 linux 中为 .Net Core HttpListener 配置 ssl

c# - 未知类型的动态转换以进行序列化

c# - 使用默认属性的 DataContractSerializer