[通过序列化DataContract将对象字段分成两个文件

问题描述 投票:2回答:2

我正在使用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;
c# serialization datacontractserializer datacontract
2个回答
0
投票

序列化整个对象后,您可以使用Linq to XML对其进行拆分。

哦,我什至在How to Split an XML file into multiple XML Files处找到了一个示例。


0
投票

我可以建议使用与序列化程序配对的Custom Xml Writer。

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。而且只有在那之后,我们的自定义编写者才会过滤它们。但它会非常迅速且有效地进行中。

© www.soinside.com 2019 - 2024. All rights reserved.