c#中序列化是什么,怎么用,什么情况下用,不用有什么后果?

c#中序列化是什么,怎么用,什么情况下用,不用有什么后果?,第1张

c#中序列化就是把一个对象保存到一个文件或数据库字段中去。

序列化用途:

1、在进程下次启动时读取上次保存的对象的信息

2、在不同的AppDomain或进程之间传递数据

3、在分布式应用系统中传递数据

常见的序列化的方法:

1、BinaryFormatter

2、SoapFormatter

3、XML序列化

用法:

BinaryFormatter的用法大致如下: 

//BinaryFormatter将对象序列化到文件中

 List<string> inputList = new List<string>() { "str1","str2","str3"}

 using (FileStream fsWriter = new FileStream(@"tmp.dat",FileMode.Create,FileAccess.Write))

 {

       BinaryFormatter bf = new BinaryFormatter()

       //序列化

       bf.Serialize(fsWriter, inputList)

 }

 //BinaryFormatter将文件中的数据反序列化出来

 List<string> outputList = new List<string>()

 using (FileStream fsReader = new FileStream(@"tmp.dat",FileMode.Open,FileAccess.Read))

 {

       BinaryFormatter bf = new BinaryFormatter()

       //反序列化

       outputList = (List<string>)bf.Deserialize(fsReader)

 }

XML序列化的用法大致如下:

//xml序列化到tmp.xml文件中

List<string> inputList = new List<string>() { "str1","str2"}

using (FileStream fsWriter = new FileStream(@"tmp.xml",FileMode.Create,FileAccess.Write))

{

      XmlSerializer xs = new XmlSerializer(typeof(List<string>))

      xs.Serialize(fsWriter, inputList)

}

//从tmp.xml文件中反序列化出来

List<string> outputList = new List<string>()

using (FileStream fsReader = new FileStream(@"tmp.xml",FileMode.Open,FileAccess.Read))

{

     XmlSerializer xs = new XmlSerializer(typeof(List<string>))

     outputList = xs.Deserialize(fsReader) as List<string>

}

总结:

两个的用法大致如下:

序列化:

1.得到一个存储对象的类型

2.创建一个写入文件流

3.定义要序列化的类型

4.调用序列化方法

反序列化:

1.定义一个装载对象的类型

2.创建一个读出文件流

3.定义要反序列化的类型

4.调用反序列化方法

BinaryFormatter类进行序列化和反序列化,以缩略型二进制格式写到一个文件中去,速度比较快,而且写入后的文件已二进制保存有一定的保密效果。标记为NonSerialized的其他所有成员都能序列化。

采用xml序列化的方式只能保存public的字段和可读写的属性,对于private等类型的字段不能进行序列化。

二进制序列化的优点:

1. 所有的类成员(包括只读的)都可以被序列化;

2. 性能非常好。

XML序列化的优点:

1. 互 *** 作性好;

2. 不需要严格的二进制依赖;

3. 可读性强

///<summary>///

序列化

/// </summary>///

<param name="data">要序列化的对象</param>

/// <returns>返回存放序列化后的数据缓</returns>

public static byte[] Serialize(object data)

{

BinaryFormatter formatter = new BinaryFormatter()

MemoryStream rems = new MemoryStream()

formatter.Serialize(rems, data)

return rems.GetBuffer()

}

/// <summary>/// 反序列化 /// </summary>

/// <param name="data">数据缓冲区</param>

/// <returns>对象</returns>

public static object Deserialize(byte[] data)

{

BinaryFormatter formatter = new BinaryFormatter()

MemoryStream rems = new MemoryStream(data)

data = nullreturn formatter.Deserialize(rems)

}

请注意看如下代码:

public List getObject(String sql, Object[] object) { //sql执行语句,object是你sql语句里面的参数

List list = new ArrayList()

Connection con = null

PreparedStatement pre = null

ResultSet rs = null

try{

con = C3P0Util.getInstance().getConnection()//这是你获得数据库连接,你把这里改成调用你自己写的jdbc方法

pre = con.prepareStatement(sql)//执行sql语句

if(object!=null){

for(int i=0i<object.lengthi++){

pre.setObject(i+1, object[i])//给sql里面的参数进行赋值

}

}

rs = pre.executeQuery()

while(rs.next()){

Users u = new User()

u.setUserName(rs.getString("UserName"))

u.setUserPas(rs.getString("UserPas"))list.add(u)

}

}catch(Exception e){

e.printStackTrace()

return null

}finally{

C3P0Util.close(con, pre, rs)//关闭数据库资源

}

return list//返回list集合

}

注意:list里面保存的是User对象的信息

你要获得User对象的信息,那么就要遍历list

for(int i=0i<list.sizei++){

User u = (User)list.get(i)System.out.println("UserName:"+u.getUserName())

System.out.println("UserPas:"+u.getUserPas())

} 上面是针对list里面有很多个User对象,当然list里面只有一个User对象,也是可以的。

如果你的list里面只有一个User,那么可以直接:User u = (User)list.get(0)

System.out.println("UserName:"+u.getUserName())

System.out.println("UserPas:"+u.getUserPas())

希望对你有帮助!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10818037.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存