.NET 中的序列化
序列化(serialization)就是把对象的当前状态(字段及其值)转换数据流,可以把得到的数据流存放到文件、数据库、内存或其它地方;然后在我们需要时,使用反序列化(deserialization)将对象恢复。在.Net中,要序列化一个对象,可以使用属性将类的元素标为可序列化的(Serializable)和不可被序列化的(NonSerialized)。通过SoapFormatter(基于XML)和BinaryFormatter可以得到不同的数据流格式。
一、可序列化(Serializable)和不可序列化(NonSerialized)属性
如果允许一个类序列化,需要在类上标记[Serializeble]属性
public class User
{
private int id;
private string name;
[NonSerialized] //标记该属性后,email字段将不会被序列化
private string email;
public User(int id, string name, string email)
{
this.id = id;
this.name = name;
this.email = email;
}
}
如果一个可序列化的类包含了对另一个类的引用,那么被引用的类也必须支持序列化
public class User
{
private int id;
private string name;
private Contact contact; //引用了一个类
public User(int id, string name, string email)
{
this.id = id;
this.name = name;
this.email = email;
}
}
[Serializable]
public class Contact
{
private string email;
private string qq;
private string msn
}
二、SoapFormatter和BinaryFormatter
下面的代码分别使用SoapFormatter和BinaryFormatter将User类序列化到文件中:
{
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap;
using System.Runtime.Serialization.Formatters.Binary;
class Program
{
static void Main(string[] args)
{
User user = new User(1001, "netflu", "netflu@msn.com");
FileStream mySoap = File.Create(@"C:\Soap_user.txt");
new SoapFormatter().Serialize(mySoap, user);
mySoap.Close();
FileStream myBinary = File.Create(@"C:\Binary_user.dat");
new BinaryFormatter().Serialize(myBinary, user);
myBinary.Close();
}
}
[Serializable]
public class User
{
private int id;
private string name;
[NonSerialized]
private string email;
public User(int id, string name, string email)
{
this.id = id;
this.name = name;
this.email = email;
}
}
}
使用SoapFormatter得到的数据流(Soap_user.txt):
<SOAP-ENV:Body>
<a1:User id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/nsassem/SerializApp/SerializApp%2C%20Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<id>1001</id>
<name id="ref-3">netflu</name>
</a1:User>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
使用BinaryFormatter得到的数据流(Binary_user.dat):
通过对SoapFormatter和BinaryFormatter输出的数据流进行观察,可以发现他们各有优缺点,Soap的可读性高,而Binary的数据量小。
三、自定义序列化
如果要精确控制对象的序列化,需要实现ISerializable接口
public interface ISerializable
{
void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
}
以下是一个实现了ISerializable接口的类:
public class User : ISerializable
{
private int id;
private string name;
private string email;
public User(int id, string name, string email)
{
this.id = id;
this.name = name;
this.email = email;
}
private User(SerializationInfo info, StreamingContext context)
{
this.id = info.GetInt32("id");
this.name = info.GetString("name");
this.email = info.GetString("email");
}
ISerializable 成员#region ISerializable 成员
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("id", id);
info.AddValue("name", name);
info.AddValue("email", email);
}
#endregion
}
主要通过SerializationInfo对象提供的AddValue方法通过键值对来保存一个值,然后通过一系列GetValue方法来取出值。
转载于:https://www.cnblogs.com/netflu/archive/2006/02/28/339962.html
.NET 中的序列化相关推荐
- Pytorch中的序列化容器-度消失和梯度爆炸-nn.Sequential-nn.BatchNorm1d-nn.Dropout
Pytorch中的序列化容器-度消失和梯度爆炸-nn.Sequential-nn.BatchNorm1d-nn.Dropout 1. 梯度消失和梯度爆炸 在使用pytorch中的序列化 容器之前,我们 ...
- java kryo 序列化_java中的序列化方式及dubbo使用kryo序列化
java中的序列化方式: 1. 自带序列化 ObjectInputSteam. ObjectOutStream等 2. hession2 3. json ,xml等格式 4.kryo 5.FST - ...
- fileinputstream自定义类序列化和反序列化_Rest Assured篇:Java中的序列化和反序列化...
点击上方蓝字设为星标 每天傍晚伴你一起成长! Java 中的序列化和反序列化是一个重要的编程概念.它适用于所有主要的编程语言.在本章中,我们将尝试在Java语言的上下文中理解此概念.在本章的最后,我们 ...
- C#中JSON序列化和反序列化
有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境-- 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...
- python中常用的序列化模块_Python中的序列化和反序列化
为什么要序列化 内存中的字典.列表.集合以及各种对象,如何保存到一个文件中. 设计一套协议,按照某种规则,把内存中的数据保存到文件中,文件是一个个字节序列.所以必须把数据额转换为字节序列,输出到文件, ...
- AFN中请求序列化的设置
最近遇到一个需求:要求从客户端传到服务器的参数是json字符串,于是我本能的用pod装了afn然后进行了request和response Serialization的相关设置 AFHTTPSessio ...
- spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava
spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava在SPRING MVC3中,比如做REST时,经常要用JASON去解析,遇到了日期格式化的问题, ...
- java中的序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...
- 谈谈:.Net中的序列化和反序列化
序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一 ...
- java 序列化实例_Java中的序列化与反序列化实例
创建的字节流与平台无关.因此,在一个平台上序列化的对象可以在另一个平台上反序列化. 为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口. ObjectOutput ...
最新文章
- idea将普通目录转换为模块maven module。
- LeetCode:104_Maximum Depth of Binary Tree | 二叉树的最大深度 | Easy
- fastxml 大于符号不转换_你可能不知道的MATLAB入门技巧#第二话
- Windows Store App JavaScript 开发:选取文件和文件夹
- 局域网从另一台电脑copy文件(Linux系统下)
- kangle 3.4.8 发布,国产开源 Web 服务器
- 计算机组成原理 透明性,计算机组成原理试题
- 占鳌头。当雪花沁透着
- 第十三首歌曲《翱翔的骄鹰》
- BZOJ 1050 [HAOI2006]旅行comf(并查集)
- 在Kotlin中@Suppress可能取到的值
- 22222222222
- ccc 邮箱_CCC的完整形式是什么?
- C语言经典例题及答案3
- Java okhttp 实现对有道翻译的爬取
- iOS音频编程之实时语音通信
- 跟随自己,让自己的灵魂做主
- 编写一个程序,检测标准IO的缓冲区的大小
- 校园快递管理系统-JAVA.JSP【数据库设计、论文、源码、开题报告】
- BGP MPLS 单域实验及排错思路