(转+整理)C#BinaryFormatter进行序列化与反序列化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(转+整理)C#BinaryFormatter进⾏序列化与反序列化
序列化⼜称串⾏化,是.NET运⾏时环境⽤来⽀持⽤户定义类型的流化的机制。
其⽬的是以某种存储形式使⾃定义对象持久化,或者将这种对象从⼀个地⽅传输到另⼀个地⽅。
.NET框架提供了两种种串⾏化的⽅式:1、是使⽤BinaryFormatter进⾏串⾏化;2、使⽤XmlSerializer进⾏串⾏化。
第⼀种⽅式提供了⼀个简单的⼆进制数据流以及某些附加的类型信息,⽽第⼆种将数据流格式化为XML存储。
可以使⽤[Serializable]属性将类标志为可序列化的。
如果某个类的元素不想被序列化,1、可以使⽤[NonSerialized]属性来标志,2、可以使⽤[XmlIgnore]来标志。
序列化意思指的是把对象的当前状态进⾏持久化,⼀个对象的状态在⾯向对象的程序中是由属性表⽰的,所以序列化类的时候是从属性读取值以某种格式保存下来,⽽类的成员函数不会被序列化,.net存在⼏种默认提供的序列化,⼆进制序列化,xml和json序列化会序列化所有的实例共有属性。
BinaryFormatter以⼆进制格式序列化和反序列化对象。
BinaryFormatte序列化:将对象转化成⼆进制。
BinaryFormatte反序列化:将⼆进制转化为对象。
命名空间: System.Runtime.Serialization.Formatters;
两个常⽤的⽅法:
Deserialize(Stream):将指定的流反序列化成对象
Serialize(Stream, Object):将对象序列化到给定的流
两个常⽤的属性:
Serializable:表⽰可以被序列化
NonSerializable:屏蔽被序列化
例如:
using UnityEngine;
using System;
using System.Collections;
using System.IO;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;
[Serializable] // 表⽰该类可以被序列化
class Person
{
private string name;
[NonSerialized] // 表⽰下⾯这个age字段不进⾏序列化
private int age;
public string Name
{
get { return name;}
set { name = value;}
}
public int Age
{
get { return age;}
set { age = value;}
}
public Person() { }
public Person(string name, int age)
{
= name;
this.age = age;
}
public void SayHi()
{
Debug.LogFormat ("我是{0}, 今年{1}岁", name, age);
}
}
public class BinarySerializer : MonoBehaviour {
string filePath = Directory.GetCurrentDirectory() + "/binaryFile.txt";
// Use this for initialization
void Start () {
List<Person> listPers = new List<Person> ();
Person per1 = new Person ("张三", 18);
Person per2 = new Person ("李四", 20);
listPers.Add (per1);
listPers.Add (per2);
SerializeMethod (listPers); // 序列化
DeserializeMethod(); // 反序列化
Debug.Log("Done ! ");
}
void DeserializeMethod() // ⼆进制反序列化
{
FileStream fs = new FileStream (filePath, FileMode.Open);
BinaryFormatter bf = new BinaryFormatter ();
List<Person> list = bf.Deserialize (fs) as List<Person>;
if (list != null)
{
for (int i = 0; i < list.Count; i++)
{
list [i].SayHi ();
}
}
fs.Close ();
}
void SerializeMethod(List<Person> listPers) // ⼆进制序列化
{
FileStream fs = new FileStream (filePath, FileMode.Create);
BinaryFormatter bf = new BinaryFormatter ();
bf.Serialize (fs, listPers);
fs.Close ();
}
// Update is called once per frame
void Update () {
}
}
序列化的⽂本打开后,内容如下所⽰:
NonSerialized作⽤:被标记的字段都赋成空
反序列化输出结果:
⼤家好,我是张三,今年0岁
⼤家好,我是李四,今年0岁
由此看出,未序列化的字段存储的值为空
⽂章转载⾃:https:///e295166319/article/details/52790131、https:///u013667895/article/details/78478458。