私は、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クラスで定義している間は、入力パラメータを持ちます。どのようにエラーをスローされていません。
'ois'は' ObjectInputStream'です。 'ois.readObject()'はクラス 'Dog2'ではなくクラス' ObjectInputStream'の関数 'readObject'を呼び出します。 _marked line 1a_ – ajb
には、あなたのオブジェクトではなく、 'ObjectInputStream'で' readObject() 'を呼び出しています。 –
Dog2ではなくObjectInputStreamのreadObject()を呼び出す場合は、行 "ois.defaultReadObject();を削除するとDog2のreadObject関数からプログラムが実行されず、エラーがスローされます。私はクラスDog 2のreadObject()に到達可能なコードをいくつか持っており、到達可能なコードがなければ、このプログラムは動作しません。したがって、Dog2クラスのreadObject()は呼び出されていますが、ObejctInputStreamsでは呼び出されません(私はObjectInputStreamオブジェクトを "Dog2"に "ois"してキャストします) –