シリアライズ/デシリアライゼーションの
概要:シリアライズ(直列化)は、オブジェクトの状態情報に変換されるプロセスの形式で格納または送信されてもよいです。
- シリアル化中に、オブジェクトの現在の状態が一時的または永久的な記憶領域に書き込まれます。以降、読み出しまたは状態の記憶領域からオブジェクトをデシリアライズすることにより、オブジェクトを再作成します。
シリアライゼーション:出力の固定値と持続のディスクへのバイトの文字列にObjectOutputStreamの、オブジェクト情報、転送フォーマットを使用。
- デシリアライズ:使用のObjectInputStream、ディスク上のシリアライズされたデータを読み、オブジェクトを復元します。
特長/シナリオ:
- その直列化機能を有効にするには、Serializableインタフェースを実装する必要があり、ファイルをシリアル化する必要があります。
- シリアル化されたデータはないシリアライズ出力オブジェクトと、クラスに属する静的なので、静的であるように変更する必要がないかもしれません。
- シリアライズされたデータは、プログラムの実行中に、過渡一時的にもを変更することができます必要としない、メモリ内にありシリアライズ永続化されることはありません。
- ときにデシリアライズし、シリアライズされたバージョンは、逆シリアル化を完了することができない、矛盾している場合。
- 添加していないコンパイラは、バージョン番号は、クラス定義情報に基づいて算出された生成した場合、各シリアライズファイルは、固有のIDを有しています。
- これは、サーバ、シリアル化されたファイル間でデータを転送するために使用される非直列化データを読み込みます。
- ホスト間でのオブジェクトを渡すソケットストリームの典型的な。
ObjectOutputStreamの
ObjectOutputStreamの
- Javaはプリミティブデータ型をオブジェクトとグラフはOutputStreamを書きます。ObjectInputStreamのは、(再構成)オブジェクトを読み取ることができます。永続ストレージは、ストリーム内のファイルオブジェクトを使用することによって達成することができます。
> -- ObjectOutputStream(OutputStream out)
创建写入指定 OutputStream 的 ObjectOutputStream。
> -- void writeObject(Object obj)
将指定的对象写入 ObjectOutputStream。
ObjectInputStreamの
ObjectInputStreamの
- 事前にObjectOutputStreamを直列化復元使って書かれた基本データとオブジェクト。
> -- ObjectInputStream(InputStream in)
创建从指定 InputStream 读取的 ObjectInputStream。
> -- Object readObject()
从 ObjectInputStream 读取对象,读取序列化数据。
ディスクにシリアライズ学生情報[連載]
public class Seri {
public static void main(String[] args) throws Exception, IOException {
//序列化:就是把java对象保存在磁盘中
ObjectOutputStream os =
new ObjectOutputStream(
new FileOutputStream( "D:\\teach\\a\\student.txt"));
Student s = new Student("张三",20,"成都");
os.writeObject(s);
os.close();//关闭输出资源
//反序列化:从磁盘读到程序里
ObjectInputStream in =
new ObjectInputStream(
new FileInputStream(
"D:\\teach\\a\\student.txt"));
//读到的对象,默认是Object,需要强转成子类
Student s2 = (Student)in.readObject();
System.out.println(s2);
}
}
//1,如果想完成序列化,类必须实现Serializable接口
//只是用来做标记,需要序列化
class Student implements Serializable{
//创建对象用
public Student(String name, int age, String addr) {
this.name = name;
this.age = age;
this.addr = addr;
}
//一般序列化的都是属性
String name = "张三";
int age = 20;
String addr = "成都";
//为了看属性值
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", addr=" + addr + "]";
}
}