3

私のコード-

import java.io.File;
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 ObjectStreamExample {

    /**
     * @param args
     */
    public static void main(String[] args) {

        Person person = new Person();
        person.setFirstName("Abhishek");
        person.setLastName("Choudhary");
        person.setAge(25);
        person.setHouseNum(256);
        ObjectOutputStream stream = null;
        try {
            stream = new ObjectOutputStream(new FileOutputStream(new File("Serialize.txt")));
            stream.writeUTF(person.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {

            e.printStackTrace();
        }finally{
            if(stream != null)
                try {
                    stream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }

        ObjectInputStream input = null;

        try {
            input = new ObjectInputStream(new FileInputStream(new File("Serialize.txt")));

            Person person2 = (Person) input.readObject();
            System.out.println(person2.getFirstName());
            System.out.println(person2.getLastName());
            System.out.println(person2.getAge());
            System.out.println(person2.getHouseNum());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }finally{
            if(input != null)
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }


    }

}

および1つのPersonBeanファイル。

例外が発生しています

java.io.OptionalDataException at java.io.ObjectInputStream.readObject0(Unknown Source)at java.io.ObjectInputStream.readObject(Unknown Source)at com.practise.interview.nio.ObjectStreamExample.main(ObjectStreamExample.java:62)

これは私が思うので上げられています-

ストリーム内の次の要素がプリミティブデータであるときに、オブジェクトを読み取ろうとしました。この場合、OptionalDataExceptionのlengthフィールドは、ストリームからすぐに読み取れるプリミティブデータのバイト数に設定され、eofフィールドはfalseに設定されます。

しかし、私がプリミティブ値を設定したことを知っているので、それを回避する方法、それで回避する方法。

4

2 に答える 2

6

あなたは を書いていてString、 を読もうとしていますPerson。それはシリアライゼーションの仕組みではありません。シリアル化のコンテキストでは、UTF 文字列はプリミティブ データと見なされます。これは、オブジェクト情報 (クラス名、属性など) が含まれておらず、文字列データのみが含まれているためです。

後でperson読みたい場合は、オブジェクト自体を書き出します。Person

stream.writeObject(person);

補遺: a を書くStringと他の と同じように動作する場合、 をにキャストできないため、代わりにObjecta を取得します。いずれにせよ、あなたが書いたものとあなたが読んだものとの間の不一致は、あなたが得たエラーを引き起こしています.ClassCastExceptionStringPerson

于 2012-04-29T08:03:22.007 に答える
1

仕様による

未読のプリミティブ データ、またはストリーム内のシリアル化されたオブジェクトに属するデータの終わりが原因で、オブジェクトの読み取り操作が失敗したことを示す例外。この例外は、次の 2 つの場合にスローされる可能性があります。

  • ストリーム内の次の要素がプリミティブ データであるときに、オブジェクトを読み取ろうとしました。この場合、OptionalDataException の length フィールドは、ストリームからすぐに読み取り可能なプリミティブ データのバイト数に設定され、eof フィールドは false に設定されます。
  • クラス定義の readObject または readExternal メソッドによって、データ コンシューマブルの末尾を超えて読み取ろうとしました。この場合、OptionalDataException の eof フィールドは true に設定され、length フィールドは 0 に設定されます。

    stream.writeUTF(person.toString()); // ここで問題

ここではUTFとして書き、もう一方の端ではPersonオブジェクトとして読んでいます。あなたはそれを変更する必要があります -

stream.writeObject(person);
于 2012-04-29T08:13:37.470 に答える