2017-01-14 18 views
-2

私は、Serializableを実装し、writeObjectとreadObjectの関数をオーバーライドするクラスを持っています。間違ったパラメータが関数に渡され、引き続き動作します(カスタマイズされたシリアライゼーション)

function readObject()を呼び出すときに、パラメータは渡されませんが、オーバーライドを定義する際にはパラメータがあります。このコードの動作状況

//I understand this part: 

package CustomizedSerialization; 

import java.io.Serializable; 

public class Cat implements Serializable 
{ 
    int k = 30; 
    int j = 10; 
    char c = 'c'; 
} 


package CustomizedSerialization; 

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 

public class Dog2 implements Serializable 
{ 

    transient Cat c = new Cat(); 

    private void writeObject(ObjectOutputStream oos) throws IOException 
    { 
     int x = c.j; 
     oos.writeInt(x); 
    } 

*********マーク:[(私は... int型)のような]パラメータの署名のいずれかの番号を続けていなくても、パラメータ線1a - のreadObject ********の入力パラメータ

private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException 
    { 
     ois.defaultReadObject(); 

     c = new Cat(); 


    } 

} 

package CustomizedSerialization; 

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 

public class SerializeDemo2 { 

    public static void main(String[] args) throws IOException, ClassNotFoundException 
    { 

     Dog2 d = new Dog2(); 

     System.out.println("Before serialization "+ d.c.j); 
     FileOutputStream fos = new FileOutputStream("C:\\serializedFile.ser"); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 

     oos.writeObject(d); 



     System.out.println("After serialization"); 
     FileInputStream fis = new FileInputStream("C:\\serializedFile.ser");   
     ObjectInputStream ois = new ObjectInputStream(fis); 

*********マーク線1a -

を********のreadObjectの入力パラメータ
 Dog2 d1 = (Dog2) ois.readObject(); 

     System.out.println(d1.c.j); 
     System.out.println(d1.c.c); 
    } 

} 

プログラム(Dog2とSerializeDemo2)で「1 aとマークされた線」はどのように機能していますか? SerializeDemo2は、パラメータなしでDog2クラスの関数readObjectを呼び出しますが、呼び出される関数(readObject)をDog2クラスで定義している間は、入力パラメータを持ちます。どのようにエラーをスローされていません。

+2

'ois'は' ObjectInputStream'です。 'ois.readObject()'はクラス 'Dog2'ではなくクラス' ObjectInputStream'の関数 'readObject'を呼び出します。 _marked line 1a_ – ajb

+0

には、あなたのオブジェクトではなく、 'ObjectInputStream'で' readObject() 'を呼び出しています。 –

+0

Dog2ではなくObjectInputStreamのreadObject()を呼び出す場合は、行 "ois.defaultReadObject();を削除するとDog2のreadObject関数からプログラムが実行されず、エラーがスローされます。私はクラスDog 2のreadObject()に到達可能なコードをいくつか持っており、到達可能なコードがなければ、このプログラムは動作しません。したがって、Dog2クラスのreadObject()は呼び出されていますが、ObejctInputStreamsでは呼び出されません(私はObjectInputStreamオブジェクトを "Dog2"に "ois"してキャストします) –

答えて

0

ObjectInputStream.readObject()パラメータがない場合は、逆シリアル化オブジェクトのreadObject(ObjectInputStream ois)メソッドが存在する場合はそれを呼び出し、次にObjectInputStream.defaultReadObject()を呼び出す必要があります。これらは3つの異なる方法であり、いずれも他の方法を上書きするものではありません。

+0

@KhushbooSingh 'オーバーライドしない'と 'どのようにキャストできますか'あなたが何を求めているのか不明です。 – EJP

+0

@ KushbooSingh私はあなたが 'ObjectInputStreamのObject ois'の意味を理解していません。 'ois'は' ObjectInputStream'であり、 'Object'ではありません。 'ObjectInputStream.readObject()'は、正しい型のオブジェクトを作成することだけです。 – EJP

+0

@KhushbooSinghあなたは意味がありません。 'ois' **は' Dog2'にキャストされていません。 'ois.readObject()'の* result *が 'Dog2'にキャストされています。 – EJP

関連する問題