c# - 通过序列化 DataContract 将对象字段分离到两个文件中

标签 c# serialization datacontractserializer datacontract

我正在使用 DataContractSerializer,我想将同一对象的数据分成多个文件。

[DataContract]
public class TestObj
{
    [DataMember]
    protected double field1 = 0.0;

    [DataMember]
    protected double field2 = 0.0;
}

具体来说,我想将 field1 保存在一个 XML 文件中,将 field2 保存在另一个 XML 文件中。有没有办法使用数据契约序列化来做到这一点?

这就是我目前序列化的方式:

DataContractSerializer serializaer = new DataContractSerializer(GetType(), null,
              0x7FFFFFFF /*maxItemsInObjectGraph*/,
              false /*ignoreExtensionDataObject*/,
              true /*preserveObjectReferences : this is most important to me */,
              null /*dataContractSurrogate*/);
var fs = File.Open(fName, FileMode.Create);
serializaer.WriteObject(fs, this);

fs.Dispose();
return true;

最佳答案

我可以建议使用与序列化程序配对的自定义 Xml 编写器。

public class CustomWriter : XmlTextWriter
{
    public CustomWriter(TextWriter writer) : base(writer) { }
    public CustomWriter(Stream stream, Encoding encoding) : base(stream, encoding) { }
    public CustomWriter(string filename, Encoding encoding) : base(filename, encoding) { }

    public List<string> FieldList { get; set; }

    private string _localName;

    public override void WriteStartElement(string prefix, string localName, string ns)
    {
        if (!FieldList.Contains(localName))
            base.WriteStartElement(prefix, localName, ns);
        else
            _localName = localName;
    }

    public override void WriteString(string text)
    {
        if (!FieldList.Contains(_localName))
            base.WriteString(text);
    }

    public override void WriteEndElement()
    {
        if (!FieldList.Contains(_localName))
            base.WriteEndElement();
        else
            _localName = null;
    }
}

按如下方式使用:

var data = new TestObj();

var serializer = new DataContractSerializer(
    typeof(TestObj), null, 0x7FFFFFFF, false, true, null);

using (var writer = new CustomWriter(Console.Out)) // Specify filename or stream instead
{
    writer.Formatting = Formatting.Indented;
    writer.FieldList = new List<string> { "field1", "field3" }; // Specify fields to ignore
    serializer.WriteObject(writer, data);
}

只需在 FieldList 属性中指定应忽略的字段列表即可。

当然,通过这种方式,DataContractSerializer 将中间创建包含类中所有元素的 xml。只有在那之后,我们的自定义编写器才会过滤它们。但它会即时发生,非常快速有效。

关于c# - 通过序列化 DataContract 将对象字段分离到两个文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58363038/

相关文章:

c# - Sql Server 中的 DateTime 插入更改值

c# - Linq to SQL 选择多列

json - 使用 JSON 和 C# 反序列化对象时缺少 guid

c# - 带有预共享字典的 .NET 二进制 XML

c# - 使用空格反序列化标记的枚举会导致 SerializationException

web.config 中的 WCF 服务 dataContractSerializer maxItemsInObjectGraph

c# - 使用 JQuery 在 TextBox 上触发 OnClick

java - 在snakeyaml中转储时创建Ruby优化版本

python - Django Rest Framework ModelSerializer 在创建时设置属性

c# - 更改 richTextBox 中的当前颜色?