我正在使用 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/