2017-05-18 8 views
0

オブジェクトをシリアライズしていますので、簡単かつ迅速にネットワーク経由でオブジェクトを送信できます。これには大きな問題が1つあります。私の配列の値を初期化した後、その配列の直列化されたオブジェクトは常に初期化された数のままです。私はこれが本当であるかどうかもわかりません。なぜなら、intのデフォルト値が0であることは間違いないと思います。私はそれを0に変更するのではなく、そのままにしますか?int配列の値を初期化した後、配列への更新はシリアルに存在しません

public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { 
    FileOutputStream ostr = new FileOutputStream(new File("ObjectFile.yeh")); 
    FileInputStream istr = new FileInputStream(new File("ObjectFile.yeh")); 
    ObjectOutputStream out= new ObjectOutputStream(ostr); 
    int[] hi = new int[5]; 
    hi[0]=3; 
    out.writeUTF("This is an Array"); 
    out.writeObject(hi); 
    hi[0]=5; 
    out.writeObject(hi); 
    out.writeUTF("Array Over"); 
    out.close(); 
    ObjectInputStream in = new ObjectInputStream(istr); 
    System.out.println(in.readUTF()); 
    int[] h = (int[]) in.readObject(); 
    System.out.println(h[0]); 
    int[] j = (int[]) in.readObject(); 
    System.out.println(j[0]); 
    System.out.println(in.readUTF()); 
    in.close(); 
} 

私は、次のコードを実行すると、それは

This is an Array 
3 
3 
Array Over 

どのように私はこの問題を解決する必要がありますを印刷しますか?

アップデート:私は、オブジェクトが一度シリアライズされた後、それはシリアルが変化していないようだことがわかっ

さらなる実験後。ここに示されているように私は、文字列配列を編集して、それの内容は、オブジェクトストリーム

public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { 
    FileOutputStream ostr = new FileOutputStream(new File("ObjectFile.yeh")); 
    FileInputStream istr = new FileInputStream(new File("ObjectFile.yeh")); 
    ObjectOutputStream out= new ObjectOutputStream(ostr); 
    String[] hi = new String[5]; 
    hi[0]="Hi"; 
    out.writeUTF("This is an Array"); 
    out.writeObject(hi); 
    hi[0]="Hello"; 
    hi[1]="Hoopla"; 
    out.writeObject(hi); 
    out.writeUTF("Array Over"); 
    out.close(); 
    ObjectInputStream in = new ObjectInputStream(istr); 
    System.out.println(in.readUTF()); 
    String[] h = (String[]) in.readObject(); 
    System.out.println(h[0]+" "+h[1]); 
    String[] j = (String[]) in.readObject(); 
    System.out.println(j[0]+" "+j[1]); 
    System.out.println(in.readUTF()); 
    in.close(); 
} 

を介して送信された後に変更されませんし、これは

This is an Array 
Hi null 
Hi null 
Array Over 

答えて

1

がそれを変更する前に、出力ストリームをリセットして印刷します。

public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { 
    FileOutputStream ostr = new FileOutputStream(new File("ObjectFile.yeh")); 
    FileInputStream istr = new FileInputStream(new File("ObjectFile.yeh")); 
    ObjectOutputStream out= new ObjectOutputStream(ostr); 
    int[] hi = new int[5]; 
    hi[0]=3; 
    out.writeUTF("This is an Array"); 
    out.writeObject(hi); 
    out.reset(); // Add this line 
    hi[0]=5; 
    out.writeObject(hi); 
    out.writeUTF("Array Over"); 
    out.close(); 
    ObjectInputStream in = new ObjectInputStream(istr); 
    System.out.println(in.readUTF()); 
    int[] h = (int[]) in.readObject(); 
    System.out.println(h[0]); 
    int[] j = (int[]) in.readObject(); 
    System.out.println(j[0]); 
    System.out.println(in.readUTF()); 
    in.close(); 
} 
1

これは動作を意図したものです。 ObjectOutputStreamは、ObjectInputStreamが構築されたときに、元のオブジェクトに渡されることはありません。それらを印刷すると、2つのメモリ位置が異なることがわかります。

int[] arr = new int[5]; 
System.out.println(arr); 
arr[0]=3; 
out.writeObject(arr); 
arr[0]=5; 
out.writeObject(arr); 
out.close(); 

ObjectInputStream in = new ObjectInputStream(istr); 
System.out.println(in.readObject()); 
System.out.println(in.readObject()); 

// Prints 
// [[email protected] 
// [[email protected] 
// [[email protected] 

同じ値を持つ新しいオブジェクトを作成し、2つのメモリ位置をマッピングすることによって、オブジェクトを "複製"します。 2回目にwriteObject()を呼び出すと、既に存在するものが見つかるため、新しいオブジェクトは作成されません。

回避策:Sending the same but modifed object over ObjectOutputStream

+0

'どちらのクローンあなたのオブジェクト、または同じ値で新しいオブジェクトを作成し、また2つのメモリ位置をマッピングしObjectOutputStream'。送信者と受信者で 'メモリの場所'が異なるという事実は無関係です。関連する唯一の事実は、最後の2つの 'メモリアドレス'からわかるように、 'ObjectOutputStream'が同じオブジェクトへの参照を保存するということです。そしてあなたは解決策を提供していません。 – EJP

関連する問題