2014-01-10 70 views
0


如果發出相同的程序,但僅與字段bar的數據結構的單個更改不同。替代內部字段的序列化

  1. 序列化會不同,當bar表示相同的值HelloWorld
  2. 序列化/反序列化過程在不同版本之間是不可交換的嗎?

例子:

//bar only represents "HelloWorld" 

//Program 1 field is String 
Class foo{ 
    String bar; //"HelloWorld" 
} 

//Program 2 field is Character[] 
Class foo{ 
    Character[] bar; //{H','e','l','l','o','W','o','r','l','d'} 
} 

//Program 3 field is ArrayList<Character> 
Class foo{ 
    Arraylist<Character> bar; //{{put('H');put('e');put('l');put('l');put('o');put('W');put('o');put('r');put('l');put('d')}} 
} 

是否有什麼我談論和這裏尋找一個名稱或詞語?

回答

0

Java不允許您在同一個包中包含多個相同名稱的類。當您嘗試編譯您的示例時,您應該看到像「foo已定義」的錯誤。

Java序列化包含該類,因此序列化到類「foo」中不能隨後反序列化爲不同的「foo2」類。這也意味着「foo」的序列化將始終不同於「foo2」的序列化。

如果你的目標是有一個「foo」類,它將字符串公開爲字符數組或者ArrayList,那麼你可以在一個類中這樣做。

import java.util.*; 

public class TooManyFoo { 
    private final String bar; 

    public TooManyFoo(String bar) { 
     this.bar = bar; 
    } 

    public String getBar() { 
     return bar; 
    } 

    public Character[] getBarAsArray() { 
     Character[] barAsArray = new Character[bar.length()]; 
     for (int i = 0; i < barAsArray.length; i++) { 
      barAsArray[i] = Character.valueOf(bar.charAt(i)); 
     } 
     return barAsArray; 
    } 

    public List<Character> getBarAsList() { 
     List<Character> barAsList = new ArrayList<Character>(); 
     for (char c : bar.toCharArray()) { 
      barAsList.add(Character.valueOf(c)); 
     } 
     return barAsList; 
    } 
} 

另一方面,大多數開發人員只是希望直接通過getter工作在foo中的String欄。

我的觀點是,Java序列化包含類,因此您必須反序列化到同一個類中。

+0

我應該更清楚地解釋自己。我正在向其他用戶發佈替代方案的影像。他們能夠交換替代Foo類的序列化字節數據嗎?如果內部表示是微妙不同的。我應該調整我的問題。 –

+0

我只是重新閱讀並編輯我的問題。該類的包含是有用的信息。如果在不同程序之間交換字節數組,那麼字節數據流可以交換。 –