天天看点

软件设计笔记(八)- 面向对象程序设计 - 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);
}