Могу ли я использовать Linq-to-xml для сохранения состояния моего объекта без необходимости использовать / знать синтаксис Xpath & XSD? - PullRequest
1 голос
/ 03 мая 2010

Можно ли использовать Linq-to-xml для сохранения состояния моего объекта без необходимости использовать / знать синтаксис Xpath & XSD?

т.е.действительно ищите простой, но гибкий способ сохранения графа объектных данных (например, имейте, скажем, 2 или 3 класса с ассоциациями) - если бы Linq-to-xml был так же прост, как сказать «сохранить этот граф в XML», и тогда вы могли бы такжезапросите его через Linq или загрузите его снова в память / измените / затем снова сохраните в файл XML.

1 Ответ

3 голосов
/ 03 мая 2010

Обычно вам не нужен 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...