2010-07-22 5 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

Вы правы. Вы должны обернуть поток в блок использования. И переназначение не допускается, когда переменная используется в блоке использования. И даже не нужно было сериализовать. Вы можете сделать это вот так:

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

Я бы переделал этот код несколько иначе, чем другие ответы, прежде всего, чтобы проверить, является ли тип сериализуемым. Нет никакого способа сделать это, используя ограничения (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; 
} 
Смежные вопросы