【发布时间】:2010-05-03 15:56:48
【问题描述】:
我可以使用 Linq-to-xml 来保持我的对象状态,而不必使用/知道 Xpath 和 XSD 语法吗?
即。真的在寻找简单但灵活的方法来持久化对象数据图(例如,说 2 或 3 个具有关联的类) - 如果 Linq-to-xml 就像说“将这个图持久化到 XML”那么简单,那么你也可以通过Linq查询,或者再次加载到内存/更改/然后重新保存到xml文件。
【问题讨论】:
标签: c# .net linq-to-xml
我可以使用 Linq-to-xml 来保持我的对象状态,而不必使用/知道 Xpath 和 XSD 语法吗?
即。真的在寻找简单但灵活的方法来持久化对象数据图(例如,说 2 或 3 个具有关联的类) - 如果 Linq-to-xml 就像说“将这个图持久化到 XML”那么简单,那么你也可以通过Linq查询,或者再次加载到内存/更改/然后重新保存到xml文件。
【问题讨论】:
标签: c# .net linq-to-xml
您通常不需要 XPath 或 XSD 来使用 LINQ-to-XML,但它也不会满足您的要求。 XmlSerializer 接近,但它是一个 tree 序列化程序,而不是 graph 序列化程序。
DataContractSerializer (.NET 3.0) 确实通过其中一个重载的构造函数提供图形支持,但不提供对 xml 的完全控制。
BinaryFormatter 提供图形支持和基于元数据/类型的工作,但如果您更改程序集,它会非常脆弱,并且不能在平台之间移植。
我怀疑要弄清楚的是:我的数据是树还是图? XmlSerializer 可能已经做了你需要的。
using System;
using System.Runtime.Serialization;
using System.IO;
[DataContract]
public class Outer {
[DataMember]
public Inner Inner { get; set; }
}
[DataContract]
public class Inner {
[DataMember]
public Outer Outer { get; set; }
}
class Program {
static void Main() {
// make a cyclic graph
Outer outer = new Outer(), clone;
outer.Inner = new Inner { Outer = outer };
var dcs = new DataContractSerializer(typeof(Outer), null,
int.MaxValue, false, true, null);
using (MemoryStream ms = new MemoryStream()) {
dcs.WriteObject(ms, outer);
ms.Position = 0;
clone = (Outer)dcs.ReadObject(ms);
}
Console.WriteLine(ReferenceEquals(
clone, clone.Inner.Outer)); // true
}
}
【讨论】:
DataContractSerializer 与preserveObjectReferences 设置为true 可能是接下来要尝试的事情。我不推荐BinaryFormatter,除了一些特定的场景。