天天看點

軟體設計筆記(八)- 面向對象程式設計 - 62.1.3 對象序列化與反序列化2.1.4 對象比較

2.1.3 對象序列化與反序列化

儲存對象的媒介:流和字元串

一串有序的二進制資料,包含一個讀寫指針。比如,java和c#要想通路一個檔案,必須建立一個流對象對檔案進行通路。
// C#, 不研究C#,代碼略
// 使用流實作序列化/反序列化
// 1 二進制序列化,
// 2 XML序列化
           

應用:大批地複制對象

先将對象序列化到記憶體流,然後将流的讀寫指針移動到開頭,開始反序列化,即可建立一個與原有對象“一模一樣”的對象。重複這個過程,可以克隆多個對象。是實作深複制的比較便捷的方式。

應用:程式退出時狀态儲存(比如,矢量繪圖軟體)

分布式系統的對象序列化

分布于不同計算機上的應用程式互相通訊,在網絡中傳輸的資料往往都應用了序列化技術。可以将對象序列化到網絡流中,進而将一個對象通過網絡從一台機器傳送到另一台機器。也可以講對象序列化為XML或JSON字元串,進而實作跨平台跨網絡的遠端對象傳送。後者在移動網際網路中更常用。

2.1.4 對象比較

定義比較規則

在C#中,通過實作IComparable接口定義比較規則
public interface IComparable{
    int CompareTo(object obj); // 1 means >, 0 means =, -1 means <
}
           
對象的判等:如果隻需要知道兩個對象是否相等,可以直接重寫Object類的Equals方法。此時必須重寫GetHashCode方法,并且判等函數重寫需要遵循一些數學定律
// java or C#, 最好通過CompareTo來實作;C#也可以通過重寫運算符重載來實作,實際開發中,慎用運算符重載。
public override bool Equals(Object obj){
    if(this.CompareTo(obj) == ){
        return true;
    }
    return false;
}
           

對象比較的目的:支援排序和查找

對象比較器

不願意直接修改類的源代碼,就可以通過第三個類來實作比較的功能
// 第三個類實作IComparer或下面這個接口
public interface IComparer<in T>{
    int Compare(T x, T y);
}
public int Compare(MyClass x, MyClass y){
    return x.Value.CompareTo(y.Value);
}