对象序列化和 IDisposable

发布于 2024-09-11 04:43:32 字数 945 浏览 4 评论 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;
           }
        }

这是来自 - 链接

有没有办法在不需要重新分配内存流对象的情况下编写此内容? 难道不应该将其丢弃(包装在 using 块中)吗?使用后重新分配的内存流是什么?

        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;
           }
        }

this is from - Link

Is there a way to write this where the memoryStream object doesn't need to be reassigned?
Shouldn't it be disposed (wrapped in a using block)? What is the memoryStream used then reassigned?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

如何视而不见 2024-09-18 04:43:32

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

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; 
   } 
} 

I am not understanding the memory stream reassignment either. Here is my refactored version.

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; 
   } 
} 
马蹄踏│碎落叶 2024-09-18 04:43:32

你是对的。您应该将流包装在 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;
     }
}

You are correct. You should wrapped the stream in a using block. And the reassignment is not allowed when the variable is used in the using block. And its not even needed to do the serializing. You could do it like this:

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;
     }
}
避讳 2024-09-18 04:43:32

我会以与其他答案略有不同的方式重构此代码,以首先检查类型是否可序列化。无法通过使用约束来做到这一点(http://bit.ly/c2Hq4s),但您可以无论如何,检查起来很容易。我只是省略了 using 并包含了 Final,只是为了表明您也可以在不使用 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;
    }

I would refactor this code slightly differently to other answers to first check if the type is serializable. There's is no way to do this by using constraints (http://bit.ly/c2Hq4s) but you can check it easily enough anyway. I just left out the using and included the Finally just to show that you could do it without the using also.

    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;
    }
空宴 2024-09-18 04:43:32

如果您想使用当前的编码,这里是同一件事的另一个示例。

    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;
    }

In case you want to use the current encoding, here is another example of the same thing.

    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;
    }
戒ㄋ 2024-09-18 04:43:32
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;
}
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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文