2008-08-27 68 views
5

log4j網絡適配器將事件作爲序列化的java對象發送。我希望能夠捕獲這個對象,並以不同的語言(python)反序列化它。這可能嗎?以不同語言反序列化

注意網絡捕捉很容易;它只是一個TCP套接字並在流中讀取。難點在於解串部分

回答

5

通常,沒有。

Java序列化的流格式定義爲in this document,但您需要訪問原始類定義(以及加載它們的Java運行時)以將流數據轉換回接近原始對象的東西。例如,類可以定義writeObject()和readObject()方法來定製它們自己的序列化表單。

編輯: lubos hasko建議有一個小Java程序反序列化的Python前面的物體,但問題是,對這項工作,你的「小Java程序」需要加載所有的版本相同如果你從一個應用程序接收日誌消息,這是非常棘手的,如果你多路複用多個日誌流,這是非常棘手的。無論哪種方式,它不會再是一個小程序。 edit2:我在這裏可能是錯的,我不知道什麼是序列化的,如果它只是log4j類,你應該沒問題;另一方面,可以記錄任意的異常,如果它們被放入流中以及我的觀點。)

定製log4j網絡適配器並用一些更容易反序列化的形式(例如,您可以使用XStream將該對象轉換爲XML表示形式)替換原始序列化會容易得多

+0

系列化規格鏈接得到領受的,現在導致普通頁面。我認爲這是正確的鏈接是這樣的:https://docs.oracle.com/javase/7/docs/platform/serialization/spec/serialTOC.html – nacho4d 2016-09-09 05:58:18

1

理論上它是可能的。現在實際上的難度取決於Java序列化格式是否記錄在案。我猜,事實並非如此。 編輯:oops, I was wrong, thanks Charles

無論如何,這是什麼,我建議你做的log4j從反序列化& Java對象

  1. 捕獲在自己的小Java程序。

  2. 現在,當您再次擁有該對象時,請使用您自己的自定義格式化程序對其進行序列化。

    提示:也許你甚至不用寫自己的自定義格式。例如,JSON (scroll down for libs)有Python和Java庫,所以理論上你可以使用Java庫序列化你的對象和Python相當於圖書館給它

  3. 發送輸出流反序列化到你的Python應用程序和反序列化

查爾斯寫道:

的問題是,這個 工作,你的 「小Java程序」 需要加載相同版本的所有 可能與 反序列化的相同類。如果你是 從一個應用程序接收日誌消息, ,如果你是 多路複用多個日誌流,真的很棘手。無論哪種方式,它不會再是一個 小程序。

難道你不能僅僅在你自己的java進程中引用Java log4j庫嗎?我只是在這裏給出適用於任何一對語言的一般建議(問題的名稱是相當語言不可知的,所以我只提供了一種通用解決方案)。無論如何,我對log4j不熟悉,也不知道是否可以將自己的序列化器「注入」它。如果可以,那麼當然你的建議更好,更清潔。

1

我建議移動到第三方格式(通過創建自己的log4j適配器等),這兩種語言都理解並可以輕鬆地編組/解組,例如, XML。

+0

JSON也可以。 – 2009-01-08 20:59:16

2

理論上,這是可能的。 Java序列化與Javaland中的所有內容一樣,都是標準化的。所以,你可能在Python中按照該標準實現一個解串器。但是,Java序列化格式不是爲跨語言使用而設計的,序列化格式與JVM內部表示對象的方式密切相關。在Python中實現JVM肯定是一個有趣的練習,它可能不是你要找的東西( - :

還有其他(數據)序列化格式是專門設計爲語言不可知的,它們通常通過剝離數據格式降到最低限度(數字,字符串,序列,字典,就是這樣),因此需要在兩端都做一些工作來將豐富的對象表示爲啞數據結構的圖形(反之亦然)

兩個例子是JSON (JavaScript Object Notation)YAML (YAML Ain't Markup Language)

ASN.1 (Abstract Syntax Notation One)是另一個數據序列化格式,而是該方法簡化的FO rmat降到了可以很容易理解的地步,ASN.1是自描述的,這意味着解碼流所需的所有信息都是在流本身編碼的。

而且,當然,XML (eXtensible Markup Language)也可以工作,前提是它不僅用於提供Java對象的「內存轉儲」的文本表示,而且還提供實際的抽象的與語言無關的編碼。

因此,長話短說:最好的辦法是要麼嘗試強制log4j以上述格式之一進行日誌記錄,而要將log4j替換爲這樣的內容或嘗試以某種方式攔截對象通過電線發送並在離開Javaland之前轉換它們。

實現JSON,YAML,ASN.1和XML的庫可用於Java和Python(以及幾乎所有人都知道的編程語言)。

1

嗯,我不是Python專家,所以我不能評論如何解決你的問題,但如果你有.NET程序,你可以使用IKVM.NET輕鬆地反序列化Java對象。我已經通過爲寫入到Socket appender的Log4J日誌消息創建.NET Client進行了實驗,它的工作非常好。

對不起,如果這個答案在這裏沒有意義。

0

如果你可以在接收端和序列化數據的類定義一個JVM,而您只需要使用Python並沒有其他的語言,那麼你可以使用的Jython:

  • 你會反序列化你使用了正確的Java方法
  • ,然後你處理你與你的Python代碼