7.序列化二进制数据

7.CSharp类对象相关-序列化


7.1 知识点

申明类对象

注意:如果要使用C#自带的序列化2进制方法
申明类和结构体时需要添加[System.Serializable]特性

[System.Serializable]
public class Person
{
    public int age = 1;
    public string name = "韬老狮";
    public int[] ints = new int[] { 1, 2, 3, 4, 5 };
    public List<int> list = new List<int>() { 1, 2, 3, 4 };
    public Dictionary<int, string> dic = new Dictionary<int, string>() { { 1,"123"},{ 2,"1223"},{ 3,"435345" } };
    public StructTest st = new StructTest(2, "123");
    public ClssTest ct = new ClssTest();
}

[System.Serializable]
public struct StructTest
{
    public int i;
    public string s;

    public StructTest(int i, string s)
    {
        this.i = i;
        this.s = s;
    }
}

[System.Serializable]
public class ClssTest
{
    public int i = 1;
}

将对象进行2进制序列化

新知识点:

  1. 内存流对象 主要用于得到字节数组,可用于网络传输
    • 类名:MemoryStream
    • 命名空间:System.IO
    • 主要方法:得到字节数组方法 GetBuffer
  2. 2进制格式化对象
    • 类名:BinaryFormatter
    • 命名空间:System.Runtime.Serialization.Formatters.Binary
    • 主要方法:序列化方法 Serialize

声明Person对象

Person person = new Person();

方法一:使用内存流得到2进制字节数组

using (MemoryStream memoryStream = new MemoryStream())
{
    // 创建2进制格式化对象
    BinaryFormatter binaryFormatter = new BinaryFormatter();

    // 序列化对象,生成2进制字节数组,写入到内存流当中
    binaryFormatter.Serialize(memoryStream, person);

    // 得到内存流的2进制字节数组
    byte[] bytes = memoryStream.GetBuffer();

    // 存储字节
    File.WriteAllBytes(Application.dataPath + "/Lesson07_CSharp类对象相关_序列化1.linwentao", bytes);

    // 关闭内存流
    memoryStream.Close();
}

方法二:使用文件流进行存储

主要用于存储到文件中

using (FileStream fileStream = new FileStream(Application.dataPath + "/Lesson07_CSharp类对象相关_序列化2.linwentao", FileMode.OpenOrCreate, FileAccess.Write))
{
    // 创建2进制格式化对象
    BinaryFormatter binaryFormatter = new BinaryFormatter();

    // 序列化对象,生成2进制字节数组,写入到文件流当中
    binaryFormatter.Serialize(fileStream, person);

    // 刷新存储
    fileStream.Flush();

    // 关闭文件流
    fileStream.Close();
}

总结

C#提供的类对象2进制序列化主要类是 BinaryFormatter,通过其中的序列化方法即可进行序列化生成字节数组


7.2 知识点代码

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;

public class Lesson07_CSharp类对象相关_序列化 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 序列化类对象第一步—申明类对象
        //注意:如果要使用C#自带的序列化2进制方法
        //申明类和结构体时需要添加[System.Serializable]特性
        #endregion

        #region 知识点二 序列化类对象第二步—将对象进行2进制序列化

        //声明Person对象
        Person person = new Person();

        //方法一:使用内存流得到2进制字节数组
        //主要用于得到字节数组 可以用于网络传输
        //新知识点
        //1.内存流对象
        //类名:MemoryStream
        //命名空间:System.IO
        //2.2进制格式化对象
        //类名:BinaryFormatter
        //命名空间:System.Runtime.Serialization.Formatters.Binary
        //主要方法:序列化方法 Serialize
        using (MemoryStream memoryStream = new MemoryStream())
        {
            //2进制格式化程序

            //创建2进制格式化对象
            BinaryFormatter binaryFormatter = new BinaryFormatter();

            //序列化对象 生成2进制字节数组 写入到内存流当中
            //用2进制格式化对象的序列化方法 传入Person对象  写入到内存流对象中
            binaryFormatter.Serialize(memoryStream, person);

            //得到内存流对的2进制字节数组
            byte[] bytes = memoryStream.GetBuffer();

            //存储字节
            File.WriteAllBytes(Application.dataPath + "/Lesson07_CSharp类对象相关_序列化1.linwentao", bytes);

            //关闭内存流
            memoryStream.Close();
        }

        //方法二:使用文件流进行存储
        //主要用于存储到文件中
        using (FileStream fileStream = new FileStream(Application.dataPath + "/Lesson07_CSharp类对象相关_序列化2.linwentao", FileMode.OpenOrCreate, FileAccess.Write))
        {
            //2进制格式化程序

            //创建2进制格式化对象
            BinaryFormatter binaryFormatter = new BinaryFormatter();

            //序列化对象 生成2进制字节数组 写入到内存流当中

            //用2进制格式化对象的序列化方法 传入Person对象  写入到文件流对象中
            binaryFormatter.Serialize(fileStream, person);

            //刷新存储
            fileStream.Flush();

            //关闭内存流
            fileStream.Close();
        }

        #endregion

        #region 总结
        //C#提供的类对象2进制序列化主要类是 BinaryFormatter
        //通过其中的序列化方法即可进行序列化生成字节数组
        #endregion
    }
}


#region 知识点一 序列化类对象第一步—申明类对象

[System.Serializable]
public class Person
{
    public int age = 1;
    public string name = "韬老狮";
    public int[] ints = new int[] { 1, 2, 3, 4, 5 };
    public List<int> list = new List<int>() { 1, 2, 3, 4 };
    public Dictionary<int, string> dic = new Dictionary<int, string>() { { 1,"123"},{ 2,"1223"},{ 3,"435345" } };
    public StructTest st = new StructTest(2, "123");
    public ClssTest ct = new ClssTest();
}



[System.Serializable]
public struct StructTest
{
    public int i;
    public string s;

    public StructTest(int i, string s)
    {
        this.i = i;
        this.s = s;
    }
}

[System.Serializable]
public class ClssTest
{
    public int i = 1;
}

#endregion


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏