• c#将对象序列化为字符串和将字符串反序列化为对象


    asp.net开发中,页面间传值最长用到的是url显式传参,session,application和cookie传值等。对于复杂对象页面传值,如果不考虑性能影响的话,通常可以使用session或者application。那么页面间如何通过url传递复杂对象呢?正像标题说的那样,对象-->字符串,然后字符串-->对象。这个过程可以用下面的代码来实现:
    Code
    using
    System;
    using System.Runtime.Serialization;
    using
    System.Runtime.Serialization.Formatters.Binary;
    using
    System.IO;

    namespace DotNet.Common.Utilities
    {
         public class
    SerializeObj
         {
             public SerializeObj()
             {
    }

             /// <summary>
             /// 序列化 对象到字符串
             ///
    </summary>
             /// <param
    name="obj">泛型对象</param>
             ///
    <returns>序列化后的字符串</returns>
             public static string
    Serialize<T>(T obj)
             {
                 try
                
    {
                     IFormatter formatter = new
    BinaryFormatter();
                     MemoryStream stream = new
    MemoryStream();
                     formatter.Serialize(stream,
    obj);
                     stream.Position = 0;
                     byte[] buffer
    = new byte[stream.Length];
                     stream.Read(buffer, 0,
    buffer.Length);
                     stream.Flush();
                    
    stream.Close();
                     return
    Convert.ToBase64String(buffer);
                 }
                 catch
    (Exception ex)
                 {
                     throw new
    Exception("序列化失败,原因:" + ex.Message);
                 }
            
    }

             /// <summary>
             /// 反序列化 字符串到对象
            
    /// </summary>
             /// <param
    name="obj">泛型对象</param>
             /// <param
    name="str">要转换为对象的字符串</param>
             ///
    <returns>反序列化出来的对象</returns>
             public static T
    Desrialize<T>(T obj, string str)
             {
                
    try
                 {
                     obj = default(T);
                    
    IFormatter formatter = new BinaryFormatter();
                     byte[] buffer
    = Convert.FromBase64String(str);
                     MemoryStream stream = new
    MemoryStream(buffer);
                     obj =
    (T)formatter.Deserialize(stream);
                    
    stream.Flush();
                     stream.Close();
                
    }
                 catch (Exception ex)
                 {
                    
    throw new Exception("反序列化失败,原因:" + ex.Message);
                
    }
                 return obj;
             }
        
    }
    }需要注意的是,通过url传递参数(get方式),参数的总长度有一定限制(对于过长的参数,不懂技术的用户是有心理障碍的)。如果复杂对象序列化为字符串后的长度超过get方式的限制,那么这个对象的传值就不适合用url显式传递,可以选择其他途径如post方式或Session方式等等。

    总结:序列化 与 反序列化的思路

    序列化:

    .NET中串行有三种,BinaryFormatter, SoapFormatter和XmlSerializer.

    其中BinaryFormattter最简单,它是直接用二进制方式把对象(Object)进行串行或反串,他的优点是速度快,可以串行private或者protected的member, 在不同版本的。NET中都兼容,可以看作是。NET自己的本命方法,当然缺点也就随之而来了,离开了。NET它就活不了,所以不能在其他平台或跨网路上进行。

    实现步骤:

    1.建立BinaryFormatter对象。

    2.使用BinaryFormatter对象的将对象序列化到内存流中。

    3.将内存流中的内容读取到一个byte数组中去,注意从流的那个位置读取,要设置Position.

    4.使用流的Flush,Close方法,将缓存中的数据强制写到目标对象中去。Flush()函数的作用就是强制将当前的缓冲区的内容写入目标设备上面。

    5.将byte数组转化为string.

    反序列化:

    实现步骤:

    1.将string转化为byte数组。

    2.将byte数组放入到内存流中.

    3.使用BinaryFormatter对象将内存流反序列化为类.

    4.使用流的Flush,Close方法,将缓存中的数据强制写到目标对象中去。

    过程图:

    类型---->BinaryFormatter序列化---->内存流--->byte数组---->string.

    类型<----BinaryFormatter反序列化<----内存流<---byte数组<----string.

  • 相关阅读:
    SI与EMI(一)
    设计上如何避免EMC问题
    EMC与地之重新认识地
    EMC学习之电磁辐射
    围殴拓扑和端接之终结篇
    T型及Fly_by拓扑之应用总结
    拓扑结构介绍及其种类
    [转]Verilog综合时wire和reg如何防止被优化
    Verilog基础知识0(`define、parameter、localparam三者的区别及举例)
    [转]jumbo frame介绍
  • 原文地址:https://www.cnblogs.com/lvfeilong/p/gasgfdgdf.html
Copyright © 2020-2023  润新知