[英]Is Java serialization deterministic?
如果我有一個實現Serializable
的類,例如:
public class Foo implements Serializable {
public String a;
public String b;
}
是否使用ObjectOutputStream
確定性地序列化對象?
我已經實現了示例代碼。
public class Foo implements Serializable {
public String a;
public String b;
}
測試班
public class Test{
public static void main(String[] args){
try{
FileOutputStream fos=new FileOutputStream("saved_filename.dat");
ObjectOutputStream oos=new ObjectOutputStream(fos);
Foo f1=new Foo();
oos.writeObject(f1);
}catch(exception e){
e.printStackTrace();
}finally{
if(fos!=null) try{fos.close();}catch{IOException e){}
if(oos!=null) try{oos.close();}catch{IOException e){}
}
}
}
看起來像這樣。
Java序列化是確定性的,從某種意義上說,在通過內置序列化機制進行序列化時,一個對象通常總是會產生相同的字節流。 有一些警告:
readObject
和writeObject
方法,或者實現Externalizable接口來自己進行序列化。 在這種情況下,確定性完全取決於您自己的代碼是否具有確定性。 我也遇到了這個問題,因為Apache Beam / Dataflow告訴我我的序列化器不是確定性的。 對於Beam,有一個不同的考慮:它有時要求序列化程序具有確定性,因為兩個與其.equals()
方法進行比較的對象也必須序列化為相同的字節流。 (可能是為了使框架可以基於字節流進行分組。)由於必須在Java中定義自己的equals
方法,因此即使兩個對象沒有序列化到相同的字節流,也可以使它們比較相等。 例如,如果對象包括一些在進行相等性比較時未考慮的字段。 因此,Beam認為Java序列化是不確定的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.