Сериализация объектов и IDisposable - PullRequest
0 голосов
/ 22 июля 2010
        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 не нужно переназначать? Разве он не должен быть утилизирован (завернут в блок использования)? Что используется memoryStream, а затем переназначается?

Ответы [ 5 ]

3 голосов
/ 23 июля 2010

Я также не понимаю переназначение потока памяти.Вот моя переработанная версия.

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; 
   } 
} 
2 голосов
/ 23 июля 2010

Вы правы.Вы должны обернуть поток в блок использования.И переназначение не допускается, когда переменная используется в блоке 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;
     }
}
0 голосов
/ 23 июля 2010
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;
}
0 голосов
/ 23 июля 2010

Если вы хотите использовать текущую кодировку, вот еще один пример того же.

    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 голосов
/ 23 июля 2010

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