【问题标题】:trying to serialize and deserialize entity object in c#尝试在 C# 中序列化和反序列化实体对象
【发布时间】:2011-09-26 08:37:57
【问题描述】:

我正在使用以下两种方法来序列化/反序列化实体框架对象(4.0 版)。 我尝试了几种方法来实现这一点,但没有运气。序列化工作正常。我得到了很好的 xml 格式的字符串,但是当我尝试反序列化时,我在 XML 中得到错误。这怎么可能?

谢谢。

    public static string SerializeObject(Object obj)
    {
        XmlSerializer ser = new XmlSerializer(obj.GetType());
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        System.IO.StringWriter writer = new System.IO.StringWriter(sb);
        ser.Serialize(writer, obj);
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(sb.ToString());
        string xml = doc.InnerXml;
        return xml;
    }
    public static object DeSerializeAnObject(string xml, Type objType)
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);
        XmlNodeReader reader = new XmlNodeReader(doc.DocumentElement);
        XmlSerializer ser = new XmlSerializer(objType);
        object obj = ser.Deserialize(reader);
        return obj;
    }

【问题讨论】:

  • 你为什么要序列化一个object;您可以将您的自定义类型序列化为 Xml...
  • 错误:XML 文档中存在错误。 Message= 不是预期的。

标签: c# .net entity-framework serialization


【解决方案1】:

我使用泛型方法进行序列化和反序列化:

/// <summary>
/// Serializes an object to Xml as a string.
/// </summary>
/// <typeparam name="T">Datatype T.</typeparam>
/// <param name="ToSerialize">Object of type T to be serialized.</param>
/// <returns>Xml string of serialized type T object.</returns>
public static string SerializeToXmlString<T>(T ToSerialize)
{
    string xmlstream = String.Empty;

    using (MemoryStream memstream = new MemoryStream())
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
        XmlTextWriter xmlWriter = new XmlTextWriter(memstream, Encoding.UTF8);

        xmlSerializer.Serialize(xmlWriter, ToSerialize);
        xmlstream = UTF8ByteArrayToString(((MemoryStream)xmlWriter.BaseStream).ToArray());
    }

    return xmlstream;
}

/// <summary>
/// Deserializes Xml string of type T.
/// </summary>
/// <typeparam name="T">Datatype T.</typeparam>
/// <param name="XmlString">Input Xml string from which to read.</param>
/// <returns>Returns rehydrated object of type T.</returns>
public static T DeserializeXmlString<T>(string XmlString)
{
    T tempObject = default(T);

    using (MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(XmlString)))
    {
        XmlSerializer xs = new XmlSerializer(typeof(T));
        XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);

        tempObject = (T)xs.Deserialize(memoryStream);
    }

    return tempObject;
} 

// Convert Array to String
public static String UTF8ByteArrayToString(Byte[] ArrBytes)
{ return new UTF8Encoding().GetString(ArrBytes); }
// Convert String to Array
public static Byte[] StringToUTF8ByteArray(String XmlString)
{ return new UTF8Encoding().GetBytes(XmlString); }

【讨论】:

    【解决方案2】:

    我认为问题在于这一行:

    string xml = doc.InnerXml;
    

    你想要所有的 xml,而不仅仅是根节点内的 xml。

    【讨论】:

    • 我后来添加了。在互联网上的某个地方发现有人正在这样做。它不能双向工作......
    【解决方案3】:

    只需返回sb.ToString(),加载到XmlDocument 没有任何作用。

    【讨论】:

      【解决方案4】:

      排除了一些冗余和用途。重构和清理:

      namespace MyProject
      {
          using System.IO;
          using System.Text;
          using System.Xml;
          using System.Xml.Serialization;
      
          public static class Serializer
          {
              #region Public Methods and Operators
      
              /// <summary>
              ///     Deserializes Xml string of type T.
              /// </summary>
              /// <typeparam name="T">Datatype T.</typeparam>
              /// <param name="XmlString">Input Xml string from which to read.</param>
              /// <returns>Returns rehydrated object of type T.</returns>
              public static T DeserializeXmlString<T>(string xmlString)
              {
                  T tempObject;
      
                  using (var memoryStream = new MemoryStream(StringToUTF8ByteArray(xmlString)))
                  {
                      var xs = new XmlSerializer(typeof(T));
                      tempObject = (T)xs.Deserialize(memoryStream);
                  }
      
                  return tempObject;
              }
      
              /// <summary>
              ///     Serializes an object to Xml as a string.
              /// </summary>
              /// <typeparam name="T">Datatype T.</typeparam>
              /// <param name="toSerialize">Object of type T to be serialized.</param>
              /// <returns>Xml string of serialized type T object.</returns>
              public static string SerializeToXmlString<T>(T toSerialize)
              {
                  string xmlstream;
      
                  using (var memstream = new MemoryStream())
                  {
                      var xmlSerializer = new XmlSerializer(typeof(T));
                      var xmlWriter = new XmlTextWriter(memstream, Encoding.UTF8);
      
                      xmlSerializer.Serialize(xmlWriter, toSerialize);
                      xmlstream = UTF8ByteArrayToString(((MemoryStream)xmlWriter.BaseStream).ToArray());
                  }
      
                  return xmlstream;
              }
      
              #endregion
      
              #region Methods
      
              private static byte[] StringToUTF8ByteArray(string xmlString)
              {
                  return new UTF8Encoding().GetBytes(xmlString);
              }
      
              private static string UTF8ByteArrayToString(byte[] arrBytes)
              {
                  return new UTF8Encoding().GetString(arrBytes);
              }
      
              #endregion
          }
      }
      

      【讨论】:

      • 我会使用public static string SerializeObject&lt;T&gt;(this T toSerialize) 而不是public static string SerializeObject&lt;T&gt;(T toSerialize)
      猜你喜欢
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 2016-10-14
      • 2014-12-24
      • 2013-04-11
      • 1970-01-01
      相关资源
      最近更新 更多