Home [C# 筆記][Serializable] 序列化 & 反序列化 1
Post
Cancel

[C# 筆記][Serializable] 序列化 & 反序列化 1

BinaryFormatter、Formatter 和IFormatter 上的序列化和還原序列化方法已過時。vs2022

序列化 & 反序列化

  • 序列化:就是將對象轉換為二進制
  • 反序列化,就是將二進制轉換為對象 目的:傳輸數據

我們在網路傳輸數據的時候,只有二進制這個型態是可以被傳輸的。

步驟:將這個類標記為序列化

Q:怎樣才可能將一個類別標記為這個類可以被序列化呢?
在類別上加上[Serializable]

範例:序列化- 將物件傳輸給對方電腦

要將p這個對象,傳輸給對方電腦

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System.Runtime.Serialization.Formatters.Binary;

//要將p這個對象 傳輸給對方電腦
Person p = new Person();
p.Name = "KIKI";
p.Age = 18;
p.Gender = 'F';

//處理文件流
using (FileStream fsWrite = new FileStream(@"C:\Users\rivalin\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
    //開始序列化對象
    BinaryFormatter bf = new BinaryFormatter(); //創建序列化對象

    //需要傳入stream,FileStream是繼承Stream,
    //根據里氏轉換原則,可以將子類賦值給父類,
    //所以就把fsWrite傳入
    bf.Serialize(fsWrite, p); //開始序列化對象
}
Console.WriteLine("序列化成功");
Console.ReadKey();

[Serializable]
public class Person
{
    private string _name;
    public string Name {
        get { return _name; }
        set { _name = value; }
    }
    private int _age;
    public int Age {
        get { return _age; }
        set { _age = value; }
    }
    private char _gender;
    public char Gender {
        get { return _gender; }
        set { _gender = value; }
    }
}

範例:反序化-接收對方發過來的二進制,反序列化成對象

接收對方發過來的二進制 反序列化成對象

1
2
3
4
5
6
7
8
9
10
11
12
13
//接收對方發過來的二進制 反序列化成對象
using System.Runtime.Serialization.Formatters.Binary;

Person p;
using (FileStream fsRead = new FileStream(@"C:\Users\rivalin\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Read))
{
    BinaryFormatter bf = new BinaryFormatter(); //創建序列化對象
    p = (Person)bf.Deserialize(fsRead); //反序列化後並轉換為person類型
}
Console.WriteLine(p.Name);
Console.WriteLine(p.Age);
Console.WriteLine(p.Gender);
Console.ReadKey();
This post is licensed under CC BY 4.0 by the author.