c# 序列化

时间:2025-03-27 15:44:37

定义:
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入临时或持久存储区。以后,可以通过从存储区中读取或反序列化对象的状态,从新创建该对象。

序列化的作用:
1.用于存储
2.用于传输
3.用户深度拷贝

方式1.
命名空间,

序列化

参数: object data
MemoryStream stream = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
(stream, data);

byte[] result = ();
();
return result;

反序列化

参数: byte[] data
MemoryStream stream = new MemoryStream(data);
BinaryFormatter bf = new BinaryFormatter();
object result = (stream);
return result;

用于序列化的类需要加上 [Serializable] 特性
这种系列化得到的数据会包含很多额外信息。用于描述这个对象
缺点: 这种方式序列化得到的数据只能由c#来进行反序列化,不能跨语言。而且还存在序列化的数据版本问题,一般不会用这种方式。如果用来深度拷贝可以选用这种方式。

方式2.
命名空间System,

序列化

参数:object structObj, byte[] bytes, int index = 0
int size = (());
IntPtr p = (size);
//将结构体拷到分配好的内存空间
(structObj, p, false);
//从内存空间拷贝到byte 数组
(p, bytes, index, size);
//释放内存空间
 (p);

反序列化

参数:byte[] bytes, int idx = 0  泛型<T> where T : struct
Type type = typeof(T);
int size = (type);
//分配结构体内存空间
IntPtr p = (size);
//将byte数组拷贝到分配好的内存空间
(bytes, idx, p, size);
//将内存空间转换为目标结构体
object obj = (p, type);
//释放内存空间
(p);
return (T)obj;

这种方式的序列化只能序列化结构体。
相比于第一种方式,序列化得到的数据要小得多,不包含结构体数据之外的其他信息。
这种序列化数据可以与原生语言(如 C++, C,Delphi)进行交互。

方式3.
Json格式序列化
使用开源框架

命名空间。

序列化

参数:object data
(data);

反序列化

参数:string json
<T>(json)

在github上有下载,要注意的是如果在Unity中使用需要下载Unity版的。否则可能会存在一些意料之外的问题,比如苹果编译报错。
json 序列化可以与各种语言进行交互。

方式4.
Protocol Buffer 序列化
使用开源框架

命名空间ProtoBuf

序列化

using (MemoryStream ms = new MemoryStream())
 {
	(ms, data);
	return ();
 }

反序列化

using (MemoryStream ms = new MemoryStream())
{
     (bts, 0, );
      = 0;
     return <T>(ms);
 }

使用ProtoBuf序列化的类需要增加 ProtoContract 特性
类的字段需要增加ProtoMember特性 参数为字段编号,不重复即可