そして、Javaの直列化におけるオブジェクトのストリーム

 

 

さらに最近では、流れの使用について話、の役割は、オブジェクトとの相互変換ストリームの流れの自己定義されたクラス間でのオブジェクトのストリームが実際にあります。

それでも次の例を見て、非常に簡単になります。

パブリッククラス学生{

プライベートint型のID。

プライベート文字列名;

プライベート文字列のセックス。

プライベート文字列TEL;

 

//省略ゲッター、セッター

 

公共学生(int型のID、文字列名、文字列の性別、文字列の電話番号){

スーパー();

this.id = ID。

this.name =名前;

this.sex =セックス。

this.tel = TEL;

}

}

 

パブリッククラスTestObjectStream {

パブリック静的無効メイン(文字列[] args){

writeObject();

readObjectメソッド();

}

 

パブリック静的ボイドのwriteObject(){

{試します

FileOutputStream fosの=新しいのFileOutputStream( "C:/ユーザー/ wangliang /デスクトップ/ 1");

ObjectOutputStreamのOOS =新しいObjectOutputStreamの(FOS);

学生STUDENT1 =新しい学生(1、 "メアリー"、 "女性"、 "11111")。

学生student2 =新しい学生(2、 "ジャック"、 "男性"、 "2222");

学生student3 =新しい学生(3、 "アンディ"、 "男性"、 "3333");

一覧<学生>リスト=は、Arrays.asList(STUDENT1、student2、student3)。

oos.writeObject(リスト); //書き込み対象

oos.flush();

fos.close();

oos.close();

}キャッチ(例外e){

e.printStackTrace();

}

}

 

パブリック静的ボイドのreadObject(){

{試します

FileInputStreamのFIS =新しいFileInputStreamを( "C:/ユーザー/ wangliang /デスクトップ/ 1");

ObjectInputStreamのOIS =新しいObjectInputStreamの(FIS);

一覧<学生>リストは=(一覧<学生>)ois.readObject(); //オブジェクトが読み込まれます

list.forEach(のSystem.out ::のprintln)。

fis.close();

ois.close();

}キャッチ(例外e){

e.printStackTrace();

}

}

}

 

次のように異常所見の動作中に、次のとおりです。

java.io.NotSerializableException:com.qianfeng.day33.entity.Student

java.io.ObjectOutputStream.writeObject0で(ObjectOutputStream.java:1184)

java.io.ObjectOutputStream.writeArrayで(ObjectOutputStream.java:1378)

java.io.ObjectOutputStream.writeObject0で(ObjectOutputStream.java:1174)

java.io.ObjectOutputStream.defaultWriteFieldsで(ObjectOutputStream.java:1548)

java.io.ObjectOutputStream.writeSerialDataで(ObjectOutputStream.java:1509)

java.io.ObjectOutputStream.writeOrdinaryObjectで(ObjectOutputStream.java:1432)

java.io.ObjectOutputStream.writeObject0で(ObjectOutputStream.java:1178)

java.io.ObjectOutputStream.writeObjectで(ObjectOutputStream.java:348)

com.qianfeng.day33.test.TestObjectStream.writeObjectで(TestObjectStream.java:28)

com.qianfeng.day33.test.TestObjectStream.mainで(TestObjectStream.java:16)

 

次のように異常なこの説明によると、シリアル化するいかなるエンティティクラス、プラスコードのシーケンスをしようとしないようにということを教えてくれる:

パブリッククラスの学生は、{java.io.Serializableのを実装します

プライベート静的最終長いserialVersionUIDの= 4500674287188895027L。

 

プライベートint型のID。

プライベート文字列名;

プライベート文字列のセックス。

プライベート文字列TEL;

 

//省略ゲッター、セッター

 

公共学生(int型のID、文字列名、文字列の性別、文字列の電話番号){

スーパー();

this.id = ID。

this.name =名前;

this.sex =セックス。

this.tel = TEL;

}

}

それはjava.io.Serializableのインターフェースを実現することですが、インターフェイスのソースコードの記述を見て:

*

* @authorのunascribed

* @see java.io.ObjectOutputStreamの

* @see java.io.ObjectInputStream

* @see java.io.ObjectOutput

* @see java.io.ObjectInput

* @see java.io.Externalizable

* @since JDK1.1

* /

パブリックインターフェイスシリアライズ{

}

 

発見インターフェースは、任意のコンテンツを持っていないこと、操作のいくつかは、シリアライズされたオブジェクトストリームがロールに関連付けられているを示し、後ろの@seeに上記の目的のほとんど流れを説明し、その後、最終的には何のシーケンスはそれをやりましたか?

私たちは、類推によって、そのようなこの言語要件でOCとして直列化のために他の言語要件、を見てすることができます次のとおりです。

オブジェクトの//データ(JSONデータ)----> OCストリーム

+(ID)JSONObjectWithData:(NSDataの*)データのオプション:(NSJSONReadingOptions)エラー選ぶ:(NSError **)エラー。

// OCオブジェクト------->データ・ストリーム(データJSON)

+(NSDataの*)dataWithJSONObject:(ID)は、objのオプション:(NSJSONWritingOptions)エラー選ぶ:(NSError **)エラー。

 

OCでは、1は、直列化エンティティクラスを実装する必要がある場合、これらのメソッドを実装する必要があり、これらの2つの方法の役割は、変換する方法を、ストリームとしてエンティティクラスを転送したいか、ファイルとして保存されたときにシステムに通知することですJSONデータ(指定されたキーと値)に、その文字列は、バイナリ方法(バイト配列)に変換することができます。

 

だから、Javaで、あなたはそれを必要としないのはなぜ?Javaリフレクションメカニズムは、簡単にこのコンテンツを完了することができますので。

だから、役割のシリアル番号はあるのシーケンスは何ですか?シリアライズとデシリアライズを確保することであることができ、正しく場合にのみ、成功した変換に同じシリアル番号。

 

おすすめ

転載: www.cnblogs.com/qfchen/p/11201743.html