簡體   English   中英

Java序列化是確定性的嗎?

[英]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序列化是確定性的,從某種意義上說,在通過內置序列化機制進行序列化時,一個對象通常總是會產生相同的字節流。 有一些警告:

  • 該協議有不同的版本,新的Java版本可能會添加新的協議版本。
  • Java在流中包含一個對象標識,以允許序列化任意對象圖。 該標識是單個流的本地標識,因此,如果將一個對象兩次序列化為兩個獨立的流,則此標識號應該相同。 但是,如果此身份是“對象”的一部分或某些對象標頭的一部分,則取決於情況。
  • 可以定義自己的readObjectwriteObject方法,或者實現Externalizable接口來自己進行序列化。 在這種情況下,確定性完全取決於您自己的代碼是否具有確定性。

我也遇到了這個問題,因為Apache Beam / Dataflow告訴我我的序列化器不是確定性的。 對於Beam,有一個不同的考慮:它有時要求序列化程序具有確定性,因為兩個與其.equals()方法進行比較的對象也必須序列化為相同的字節流。 (可能是為了使框架可以基於字節流進行分組。)由於必須在Java中定義自己的equals方法,因此即使兩個對象沒有序列化到相同的字節流,也可以使它們比較相等。 例如,如果對象包括一些在進行相等性比較時未考慮的字段。 因此,Beam認為Java序列化是不確定的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM