0
        public static  string SerializeObject<T>(T obj)
        {
           try
           {
              string xmlString = null;
              MemoryStream memoryStream = new MemoryStream();
              XmlSerializer xs = new XmlSerializer(typeof(T));
              XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
              xs.Serialize(xmlTextWriter, obj);
              memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
              xmlString = UTF8ByteArrayToString(memoryStream.ToArray());      return xmlString;
           }
           catch
           {
              return string.Empty;
           }
        }

这是来自 - http://geekswithblogs.net/paulwhitblog/archive/2007/07/20/114076.aspx

有没有办法在不需要重新分配 memoryStream 对象的情况下编写这个?它不应该被处理(包装在 using 块中)吗?然后重新分配的 memoryStream 是什么?

4

5 回答 5

3

我也不理解内存流重新分配。这是我的重构版本。

public static string SerializeObject<T>(T obj) 
{ 
   try 
   { 
      using (MemoryStream ms = new MemoryStream()) 
      {
        XmlSerializer xs = new XmlSerializer(typeof(T)); 
        XmlTextWriter xwriter = new XmlTextWriter(ms, Encoding.UTF8); 
        xs.Serialize(xwriter, obj); 
        return UTF8ByteArrayToString(ms.ToArray());
      }
   } 
   catch 
   { 
      return string.Empty; 
   } 
} 
于 2010-07-22T20:20:12.027 回答
2

你是对的。您应该将流包装在 using 块中。并且在 using 块中使用变量时不允许重新分配。它甚至不需要进行序列化。你可以这样做:

public static string SerializeObject<T>(T obj)
{
    try
    {
         string xmlString = null;
         using (MemoryStream memoryStream = new MemoryStream())
         {
            XmlSerializer xs = new XmlSerializer(typeof(T));
            XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
            xs.Serialize(xmlTextWriter, obj);
            xmlString = UTF8ByteArrayToString(memoryStream.ToArray()); 
            return xmlString;
        }
     }
     catch
     {
         return string.Empty;
     }
}
于 2010-07-22T20:17:45.753 回答
0

我会将此代码重构为与其他答案略有不同,以首先检查类型是否可序列化。没有办法通过使用约束(http://bit.ly/c2Hq4s)来做到这一点,但无论如何你都可以很容易地检查它。我只是省略了 using 并包含了 finally 只是为了表明您也可以在不使用 using 的情况下做到这一点。

    public static  string SerializeObject<T>(T obj)
    {
       if (!typeof(T).IsSerializable)
       {
           throw new ArgumentException("type is not serializable");
       }

       string xmlString = string.Empty;
       MemoryStream memoryStream = new MemoryStream();

       try
       {
          XmlSerializer xs = new XmlSerializer(typeof(T));
          XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
          xs.Serialize(xmlTextWriter, obj);
          xmlString = UTF8ByteArrayToString(memoryStream.ToArray());      
       }
       catch // something useful here
       {
          // Do something useful here
       }
       finally
       {
          // Dispose of what you want here
       }

       return xmlString;
    }
于 2010-07-22T20:31:14.310 回答
0

如果你想使用当前的编码,这里有另一个相同的例子。

    public static string SerializeObject<T>(T o)
    {
        string serializeObject = string.Empty;
        if (o != null)
        {
            try
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    XmlSerializer xs = new XmlSerializer(typeof(T));
                    xs.Serialize(ms, o);
                    using (System.IO.StreamReader sr = new StreamReader(ms))
                    {
                        serializeObject = sr.CurrentEncoding.GetString(ms.ToArray());
                    }
                }
            }
            catch { }
        }
        return serializeObject;
    }
于 2010-07-22T21:00:30.633 回答
0
public static string SerializeObject<T>(T o)
{
    var serialized = "";
    try
    {
        using (var ms = new MemoryStream())
        {
            var xs = new XmlSerializer(typeof(T));
            xs.Serialize(ms, o);
            using (var reader = new StreamReader(ms))
            {
                serialized = sr.CurrentEncoding.GetString(ms.ToArray());
            }
        }
    }
    catch
    {
       // bad stuff happened.
    }

    return serialized;
}
于 2010-07-22T21:07:31.417 回答