gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:23 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com