2010-11-08 39 views
3

是否有任何方式在java世界序列化,而無需無參數構造函數和Serializable的實現?Java序列化庫,不需要無參數構造函數和Serializable實現

+3

Java序列化並不需要一個沒有參數的構造函數。 – 2010-11-08 17:10:06

+2

是的。請參閱對象序列化規範和Tom Hawtin的評論。 – EJP 2010-11-09 09:19:05

+1

EJP,這是不正確的,史蒂夫郭是。請參閱http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html#4539。你的可序列化類*必須*「有權訪問它的第一個不可序列化的超類的無參數構造函數」。換句話說,如果您查找繼承樹,則您看到的第一個不可序列化的類必須具有非私有的noarg構造函數。更多來... – 2012-02-02 07:47:26

回答

0

我相信在某些情況下,儘管類型的聲明,你可以強制序列化。但是存在固有的風險,因爲該類可能具有不可序列化的字段,這會導致運行時異常。

我很好奇,雖然你得到無參數的默認構造函數是免費的,除非你寫了自定義的構造函數。此外,實現Serializable需要30秒的查找/替換。

是否有一個原因,你試圖避免這些?

+0

是的,我想要序列化的樹中有許多第三方類的對象(對於其中我無法訪問的源)。 – Vladimir 2010-11-08 14:58:14

2

JBoss Serialization是標準java序列化的直接替換,它不需要你實現java.io.Serializable。除此之外,(而事實上,它的速度更快),這是一樣的標準序列化機制(它甚至使用相同的ObjectInputObjectOutput接口。

PS它有其他的JBoss的東西不存在依賴關係,它只是一個JBoss的低層次庫出來,作爲一個獨立的項目。

0

......和實現Serializable接口?

可惜不是所有的序列化對象米ust執行java.io.Serializable。至於您的問題的第一部分,您可以使用ObjectInputStream/ObjectOutputStream將對象序列化爲字節數組,反之亦然。

下面的例子演示瞭如何:

public static byte[] toByteArray(Object object) throws IOException { 
     if (!isSerializable(object)) { 
      throw new IOException("Object '" + object.getClass().getName() + "' is not serializable."); 
     } 

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ObjectOutputStream oos = null; 
    try { 
     oos = new ObjectOutputStream(baos); 
     oos.writeObject(object); 
     oos.flush(); 
    } finally { 
     if (oos != null) { 
      try { 
       oos.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       logger.error("Closing of ObjectOutputStream failed.", e); 
      } 
     } 
    } 

    return baos.toByteArray(); 
} 

public static Object toObject(byte[] bytes) throws IOException, ClassNotFoundException { 
    Object object = null; 
    ObjectInputStream ois = null; 

    try { 
     ois = new ObjectInputStream(new ByteArrayInputStream(bytes)); 
     object = ois.readObject(); 
    } finally { 
     if (ois != null) { 
      try { 
       ois.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       logger.error("Closing of ObjectInputStream failed.", e); 
      } 
     } 
    } 

    return object; 
} 
+0

Elite,這段代碼演示瞭如何序列化和反序列化,但問題的關鍵是如何讓您的類可序列化,以便當您的類的實例傳遞給上面所寫的toByteArray方法時,不會有NotSerializableException 。 – 2012-02-02 08:16:20

+0

@ConcreteGannet,正如我在我的帖子中所說的(請閱讀),它只是通過擴展'Serializable'來讓你的課程能夠進入序列化。 – 2012-02-02 08:37:34

0

Eishay史密斯做a benchmarking of Java serializers,其中包括一些information about each one,雖然它並沒有說他們是否使用無參數的構造函數(在許多情況下,他們不」即使使用任意對象也是如此,所以問題是沒有意義的)。這可能值得一看。

+0

我看不到有關構造函數的任何信息。 – EJP 2010-11-09 09:17:52

+0

你是對的,在那個頁面上沒有任何東西 - 編輯相應。在某個與該項目相關的地方,每個工具都有一個更詳細的描述,其中包括類似的東西。不過,我找不到它。 – 2010-11-09 09:48:21

1

做一個可怕的方法是建立一個並行的類層次結構,每個類都有一個第三方層次結構中的類,每個類都實現Externalizable,並通過編寫適當的字段來自第三方對象。不過,我不會。

+0

+1非常不必要的開箱即用思維。 – Philip 2013-01-06 02:41:53

0

Databoard,它可以序列化bean樣式,記錄樣式和不可變樣式的類。你也可以編寫自己的類外部綁定。

0

有其他人所說的一系列替代方案。如果你想使用writeObject和readObject繼承標準的Java序列化,你可以編寫自己的適配器類,它繼承自第三方類,在你自己的類上實現Serializable,並覆蓋writeObject和readObject,換句話說,實現自定義序列化你的班。

0

請參閱http://www.jguru.com/faq/view.jsp?EID=251942說明。

實現Serializable的類的構造函數的唯一要求是,其繼承層次結構中的第一個不可序列化的超類必須具有無參數構造函數。

  1. Serializeble無無參數的構造與用無參數構造

    public class MySerializableClass implements Serializable { 
        public MySerializableClass (...)... 
    } 
    
  2. Serializeble無無參數的構造延伸Object與用無參數構造延伸MyFirstClass

    public class MyFirstClass { 
    } 
    public class MySecondClass extends MyFirstClass implements Serializable { 
        public MySecondClass (...)... 
    } 
    
  3. NOT serializableble as MyFirstClass not implement Serializable並沒有默認的構造函數。

    public class MyFirstClass { 
        public MyFirstClass (...)... 
    } 
    public class MySecondClass extends MyFirstClass implements Serializable { 
        public MySecondClass (...)... 
    } 
    
相關問題