Обычно вам не нужен XPath или XSD для использования LINQ-to-XML, но он также не будет делать то, что вы хотите. XmlSerializer
подходит близко, но это сериализатор дерево , а не сериализатор 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
}
}