是否有任何方式在java世界序列化,而無需無參數構造函數和Serializable的實現?Java序列化庫,不需要無參數構造函數和Serializable實現
回答
我相信在某些情況下,儘管類型的聲明,你可以強制序列化。但是存在固有的風險,因爲該類可能具有不可序列化的字段,這會導致運行時異常。
我很好奇,雖然你得到無參數的默認構造函數是免費的,除非你寫了自定義的構造函數。此外,實現Serializable需要30秒的查找/替換。
是否有一個原因,你試圖避免這些?
是的,我想要序列化的樹中有許多第三方類的對象(對於其中我無法訪問的源)。 – Vladimir 2010-11-08 14:58:14
JBoss Serialization是標準java序列化的直接替換,它不需要你實現java.io.Serializable
。除此之外,(而事實上,它的速度更快),這是一樣的標準序列化機制(它甚至使用相同的ObjectInput
和ObjectOutput
接口。
PS它有其他的JBoss的東西不存在依賴關係,它只是一個JBoss的低層次庫出來,作爲一個獨立的項目。
......和實現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;
}
Elite,這段代碼演示瞭如何序列化和反序列化,但問題的關鍵是如何讓您的類可序列化,以便當您的類的實例傳遞給上面所寫的toByteArray方法時,不會有NotSerializableException 。 – 2012-02-02 08:16:20
@ConcreteGannet,正如我在我的帖子中所說的(請閱讀),它只是通過擴展'Serializable'來讓你的課程能夠進入序列化。 – 2012-02-02 08:37:34
Eishay史密斯做a benchmarking of Java serializers,其中包括一些information about each one,雖然它並沒有說他們是否使用無參數的構造函數(在許多情況下,他們不」即使使用任意對象也是如此,所以問題是沒有意義的)。這可能值得一看。
我看不到有關構造函數的任何信息。 – EJP 2010-11-09 09:17:52
你是對的,在那個頁面上沒有任何東西 - 編輯相應。在某個與該項目相關的地方,每個工具都有一個更詳細的描述,其中包括類似的東西。不過,我找不到它。 – 2010-11-09 09:48:21
做一個可怕的方法是建立一個並行的類層次結構,每個類都有一個第三方層次結構中的類,每個類都實現Externalizable,並通過編寫適當的字段來自第三方對象。不過,我不會。
+1非常不必要的開箱即用思維。 – Philip 2013-01-06 02:41:53
和Databoard,它可以序列化bean樣式,記錄樣式和不可變樣式的類。你也可以編寫自己的類外部綁定。
有其他人所說的一系列替代方案。如果你想使用writeObject和readObject繼承標準的Java序列化,你可以編寫自己的適配器類,它繼承自第三方類,在你自己的類上實現Serializable,並覆蓋writeObject和readObject,換句話說,實現自定義序列化你的班。
請參閱http://www.jguru.com/faq/view.jsp?EID=251942說明。
實現Serializable
的類的構造函數的唯一要求是,其繼承層次結構中的第一個不可序列化的超類必須具有無參數構造函數。
Serializeble無無參數的構造與用無參數構造
public class MySerializableClass implements Serializable { public MySerializableClass (...)... }
Serializeble無無參數的構造延伸
Object
與用無參數構造延伸MyFirstClass
public class MyFirstClass { } public class MySecondClass extends MyFirstClass implements Serializable { public MySecondClass (...)... }
NOT serializableble as
MyFirstClass
not implementSerializable
並沒有默認的構造函數。public class MyFirstClass { public MyFirstClass (...)... } public class MySecondClass extends MyFirstClass implements Serializable { public MySecondClass (...)... }
- 1. DdlGenerator構造函數不需要參數?
- 2. 序列化Java:哪些類需要「實現Serializable」?
- 3. 爲什麼基類(不實現Serializable)如果其子類實現Serializable,應該沒有參數構造函數?
- 4. 需要度數序列的Java Jung圖構造函數
- 5. 爲什麼元組沒有無參數構造函數,而`[Serializable]`?
- 6. Java中的參數化構造函數
- 7. 構造函數參數值未實現
- 8. 在需要複製構造函數時實例化GCC:模板構造函數
- 9. java.lang.RuntimeException:無法實例化@Form類。無無參數構造函數
- 10. PHP類實現Serializable不會序列化
- 11. 從C#中的參數化構造函數調用無參數構造函數?
- 12. 番石榴ForwardingObject,序列化和參數的構造函數
- 13. 構造函數和無參數構造函數?
- 14. 爲什麼JAVA需要構造函數?
- 15. GWT實現Serializable接口 - 專用的默認構造函數
- 16. 默認和參數化構造函數
- 17. 泛型和參數化構造函數
- 18. 參數化和轉換構造函數
- 19. MapStruct和參數化構造函數?
- 20. 無參數構造函數調用2參數構造函數
- 21. 無參數構造函數
- 22. 無參數構造函數
- 23. .Net RIA服務:DomainService需要一個無參數構造函數?
- 24. 需要添加無參數構造函數。困惑什麼也
- 25. 無法鏈接到需要參數的基礎構造函數
- 26. Dapper需要一個無參數構造函數?
- 27. JAXB需要一個公共的無參數構造函數嗎?
- 28. 如何實例化模板類的構造函數時需要的參數
- 29. 用參數構造函數實現的Java Inner-class direclty?
- 30. 斯卡拉 - 蛋糕圖案+類型類+實現需要構造函數參數
Java序列化並不需要一個沒有參數的構造函數。 – 2010-11-08 17:10:06
是的。請參閱對象序列化規範和Tom Hawtin的評論。 – EJP 2010-11-09 09:19:05
EJP,這是不正確的,史蒂夫郭是。請參閱http://docs.oracle.com/javase/7/docs/platform/serialization/spec/serial-arch.html#4539。你的可序列化類*必須*「有權訪問它的第一個不可序列化的超類的無參數構造函數」。換句話說,如果您查找繼承樹,則您看到的第一個不可序列化的類必須具有非私有的noarg構造函數。更多來... – 2012-02-02 07:47:26