2010-07-22 9 views
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객체 직렬화와는 IDisposable

MemoryStream을 개체를 재 할당 할 필요가없는 곳을 작성하는 방법이 있나요? 폐기해야합니까? (사용 블록으로 싸서)? 재사용되는 memoryStream은 무엇입니까?

답변

2

정확합니다. 사용중인 블록에서 스트림을 래핑해야합니다. 변수가 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; 
    } 
} 
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; 
    } 
} 
0

이 코드는 다른 형식과 약간 다르게 리팩토링하여 형식이 serializable인지 먼저 확인합니다. 제약 조건 (http://bit.ly/c2Hq4s)을 사용하여이를 수행 할 방법이 없지만 어쨌든 쉽게 확인할 수 있습니다. 방금 사용을 생략하고 마침내 당신이 일 수 있다는 것을 보여주기 위해도 사용하지 않고 할 수 있습니다.

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; 
    } 
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; 
    } 
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; 
} 
관련 문제