【问题标题】:XMLSerializer to XElementXMLSerializer 到 XElement
【发布时间】:2011-12-16 08:39:38
【问题描述】:

我一直在数据库 LINQ 中使用 XML,发现使用序列化程序非常困难。

数据库 LINQ 需要一个存储 XElement 的字段。

我有一个复杂的对象,有很多自定义的结构类,所以我想使用 XmlSerializer 来序列化对象。

但是,序列化器只能序列化到文件(“C:\xxx\xxx.xml”)或内存流。

但是,如何将其转换或序列化为 XElement,以便我可以使用 LINQ 将其存储在数据库中?

以及如何做相反的事情?即反序列化 XElement...

【问题讨论】:

    标签: c# .net xml linq serialization


    【解决方案1】:

    尝试使用这个

    using (var stream = new MemoryStream())
    {
        serializer.Serialize(stream, value);
        stream.Position = 0;
    
        using (XmlReader reader = XmlReader.Create(stream))
        {
            XElement element = XElement.Load(reader);
        }
    }
    

    反序列化:

    XmlSerializer xs = new XmlSerializer(typeof(XElement));
    using (MemoryStream ms = new MemoryStream())
    {
         xs.Serialize(ms, xml);
         ms.Position = 0;
    
         xs = new XmlSerializer(typeof(YourType));
         object obj = xs.Deserialize(ms);
    }
    

    【讨论】:

    • 谢谢!这似乎应该比现在更容易。
    • 虽然这可行,但@Timothy 的回答要好得多。
    【解决方案2】:

    为了使 John Saunders 所描述的内容更加明确,反序列化非常简单:

    public static object DeserializeFromXElement(XElement element, Type t)
    {
        using (XmlReader reader = element.CreateReader())
        {
            XmlSerializer serializer = new XmlSerializer(t);
            return serializer.Deserialize(reader);
        }
    }
    

    序列化有点混乱,因为从 XElement 或 XDocument 调用 CreateWriter() 会创建子元素。 (此外,从 XElement 创建的 XmlWriter 具有 ConformanceLevel.Fragment,这会导致 XmlSerialize 失败,除非您使用解决方法here。)因此,我使用了 XDocument,因为这需要单个元素,并且可以帮助我们解决XmlWriter 问题:

    public static XElement SerializeToXElement(object o)
    {
        var doc = new XDocument();
        using (XmlWriter writer = doc.CreateWriter())
        {
            XmlSerializer serializer = new XmlSerializer(o.GetType());
            serializer.Serialize(writer, o);
        }
    
        return doc.Root;
    }
    

    【讨论】:

      【解决方案3】:

      首先,请参阅Serialize Method,了解序列化程序可以处理的不仅仅是内存流或文件。

      其次,尝试使用 XElement.CreateWriter,然后将生成的 XmlWriter 传递给序列化程序。

      【讨论】:

      【解决方案4】:

      SQL有XML数据类型可能这个可以帮你看看msdn

      【讨论】:

      • 这对序列化或 XElement 有何帮助?
      猜你喜欢
      • 2012-11-07
      • 2019-03-27
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多