.net 序列化反序列化

.net 序列化反序列化

序列化】 就是将我们程序中的对象通过字节流写入存储媒体或网络中。

反序列化】 就是把已存入的媒体或接收的网络流中的内容转换成程序运行中的对象。

  实现方式: 二进制序列化 XML序列化

  二进制序列化需要引入System..Runtime.Serialization.Formatters.Binary 中的BinaryFormatter类, 序列化方法为Serialize(Stream s, object o), 反序列化方法DeSerialize(Stream s).
XML序列化可分为Soap格式和一般xml格式序列化。分别采用System.Runtime.Serialization.Formatters.Soap.SoapFormatter 和 XmlSerializer类的以上两种方法;
  示例:
1)用到类User
    [Serializable]
    
public   class  User
    
... {
       
            [NonSerialized]             //不对_usercode进行序列化, [NoSerialized]只能加在域成员前面
        private string _usercode;
        
private string _username;

        
public string UserCode
        
...{
            
get ...return _usercode; }
            
set ...{ _usercode = value; }
        }


        
public string UserName
        
...{
            
get ...return _username; }
            
set ...{ _username = value; }
        }

    }
2) 二进制序列化
  FileStream fs  =   new  FileStream( @" D:/user.dat " , FileMode.OpenOrCreate);
        User user 
=   new  User();
        user.UserCode 
=   " 0001 " ;
        user.UserName 
=   " KILL " ;

        BinaryFormatter bf 
=   new  BinaryFormatter();
        bf.Serialize(fs, user);
        fs.Close();

3)二进制反序列化

        FileStream fs  =   new  FileStream( @" D:/user.dat " , FileMode.OpenOrCreate);
        BinaryFormatter bf 
=   new  BinaryFormatter();
        User user 
=  (User)bf.Deserialize(fs);
        fs.Close();
        Response.Write(user.UserCode 
+  user.UserName);  //  因为User类中限制将usercode进行序列化, 所以UserCode =""

4) XML序列化,反序列化--SoapFormatter

   // 序列化
    FileStream fs  =   new  FileStream( @" D:/user.dat " , FileMode.OpenOrCreate);
        SoapFormatter sf 
=   new  SoapFormatter();
        User user 
=   new  User();
        user.UserName 
=   " KKK " ;
        user.UserCode 
=   " 0001 " ;
        sf.Serialize(fs, user);
        fs.Close();
        
        
// 反序列化
    FileStream fs  =   new  FileStream( @" D:user.dat " , FileMode.OpenOrCreate);
        SoapFormatter sf 
=   new  SoapFormatter();
        User user 
=  (User)sf.Deserialize(fs);
        fs.Close();
        Response.Write(user.UserCode 
+  user.UserName);  //  因为User类中限制将usercode进行序列化, 所以UserCode =""

5) XML序列化,反序列化--XmlSerializer


        
// 序列化
    FileStream fs  =   new  FileStream( @" D:/user.xml " , FileMode.OpenOrCreate);
     
User user  =   new  User();
        user.UserName 
=   " KKK " ;
        user.UserCode 
=   " 0001 " ;
           XmlSerializer xsl = new XmlSerializer(typeof(User));
        xsl.Serialize(fs, user);
        fs.Close();
        
        
// 反序列化
    FileStream fs  =   new  FileStream( @" D:/user.dat " , FileMode.OpenOrCreate);
        XmlSerializer xsl 
=   new  XmlSerializer();
        User user 
=  (User)xsl.Deserialize(fs);
        fs.Close();
        Response.Write(user.UserCode 
+  user.UserName);  //  因为User类中限制将usercode进行序列化, 所以UserCode =""

 

 

net 序列化、反序列化之自定义序列化

   这是继上篇序列化、反序列化的姊妹篇

  自定义序列化、反序列化有两点要求:

  1. 类要实现System.Runtime.Serialization 命名空间的 ISerializable 接口(当然要有[Serializable]属性)。
  2. 类要实现两个方法:一、ISerializable 接口的 void GetObjectData(SerializationInfo info, StreamingContext context). 二、要实现一个构造函数 pubic classname(Serializationinfo info, StreamingContext context).

  下面主要说明以上两个方法的作用以及给出示例代码:

        void GetObjectData(Serializationinfo info, StreamContext context ) 是用来处理要进行序列化的成员,其中info 参数提供各个成员字段信息,可在此时对对象中的成员赋值,调用AddValue()方法。

       构造函数是在反序列化时自动调用, 并利用info.GetStirng(GetDecimal )等函数获取值。

  自定义类:

[Serializable]
public   class  Fruit : ISerializable
... {
    
private string _code;
    
private string _name;

    
public string Code
    
...{
        
get ...return _code; }
        
set ...{ _code = value; }
    }

    
public string Name
    
...{
        
get ...return _name; }
        
set ...{ _name = value; }
    }

    
public Fruit()
    
...{ }

    
public Fruit(string code, string name)
    
...{
        
this._code = code;
        
this._name = name;
    }


    
public void GetObjectData(SerializationInfo info, StreamingContext context)
    
...{
        info.AddValue(
"aname"this._name);
        info.AddValue(
"acode"this._code);
    }


    
public Fruit(SerializationInfo info, StreamingContext context)
    
...{
        
this.Name = info.GetString("aname");
        
this.Code = info.GetString("acode");
    }

 实现:

页面加载时序列化到文件

  protected   void  Page_Load( object  sender, EventArgs e)
    
... {
      
        
//序列化
        FileStream fs = new FileStream(@"D: fruit.xml", FileMode.OpenOrCreate);
        Fruit fruit 
= new Fruit("0001""苹果");
        XmlSerializer xsl 
= new XmlSerializer(typeof(Fruit));
       
        xsl.Serialize(fs, fruit);
        fs.Close();
    }

 

点击按钮反序列化为对象

  protected   void  Button1_Click( object  sender, EventArgs e)
    
... {
        
//反序列化
        FileStream fs = new FileStream(@"D: ruit.xml", FileMode.OpenOrCreate);
        XmlSerializer xsl 
= new XmlSerializer(typeof(Fruit));

        Fruit fruit 
=(Fruit) xsl.Deserialize(fs);
        fs.Close();
        Response.Write(fruit.Code 
+ "," + fruit.Name);
        
    }

 

 

原文链接:http://blog.csdn.net/yardley2008/article/details/2237142

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值