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
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 に答える
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

タイプがシリアル化可能かどうかを最初に確認するために、このコードを他の回答とは少し異なる方法でリファクタリングします。制約(http://bit.ly/c2Hq4s)を使用してこれを行う方法はありませんが、とにかく簡単に確認できます。使用を省略し、Finallyを含めたのは、使用しなくても実行できることを示すためです。

    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 に答える