代码之家  ›  专栏  ›  技术社区  ›  Greg

我可以使用linq to xml来持久化我的对象状态,而不必使用/知道xpath&xsd语法吗?

  •  1
  • Greg  · 技术社区  · 15 年前

    我是否可以使用linq to xml来持久化对象状态,而不必使用/知道xpath&xsd语法?

    也就是说,真正寻找简单但灵活的方法来持久化对象数据图(例如,有两个或三个具有关联的类)-如果linq to xml就像说“持久化这个图到xml”一样简单,那么您也可以通过linq查询它,或者再次将它加载到内存中/change/然后重新保存到XML文件。

    1 回复  |  直到 15 年前
        1
  •  3
  •   Marc Gravell    15 年前

    您通常不需要xpath或xsd来使用linq to xml,但它也不会做您想要的事情。 XmlSerializer 很接近,但是 序列化程序,不是 图表 序列化程序。

    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
        }
    }