【问题标题】:Can I use Linq-to-xml to persist my object state without having to use/know Xpath & XSD Syntax?我可以使用 Linq-to-xml 来保持我的对象状态而无需使用/知道 Xpath 和 XSD 语法吗?
【发布时间】:2010-05-03 15:56:48
【问题描述】:

我可以使用 Linq-to-xml 来保持我的对象状态,而不必使用/知道 Xpath 和 XSD 语法吗?

即。真的在寻找简单但灵活的方法来持久化对象数据图(例如,说 2 或 3 个具有关联的类) - 如果 Linq-to-xml 就像说“将这个图持久化到 XML”那么简单,那么你也可以通过Linq查询,或者再次加载到内存/更改/然后重新保存到xml文件。

【问题讨论】:

    标签: c# .net linq-to-xml


    【解决方案1】:

    您通常不需要 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
        }
    }
    

    【讨论】:

    • 其实是一个有向图。
    • @Greg - 然后将DataContractSerializerpreserveObjectReferences 设置为true 可能是接下来要尝试的事情。我推荐BinaryFormatter,除了一些特定的场景。
    • Tks - 我会看看这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多