log4j网络适配器将事件作为序列化的Java对象发送。我希望能够捕获此对象并以另一种语言(python)将其反序列化。这可能吗?

注意网络捕获很容易;它只是一个TCP套接字,并在流中读取。困难是反序列化部分

最佳答案

通常,不会。

Java序列化的流格式定义为in this document,但是您需要访问原始类定义(以及将它们加载到Java运行时中)以将流数据转换回接近原始对象的内容。例如,类可以定义writeObject()和readObject()方法以自定义其自己的序列化形式。

(编辑: lubos hasko建议使用一个小的Java程序对Python前面的对象进行反序列化,但是问题在于,要使其正常工作,您的“小Java程序”需要加载所有相同类的相同版本 edit2:如果您从一个应用程序接收日志消息,这将很棘手,如果您要多路复用一个以上的日志流,这将非常棘手。我在这里可能是错的,我不知道要序列化什么,如果只是log4j类,那应该没问题;另一方面,可以记录任意异常,如果它们也被放入流中,我的观点是)

自定义log4j网络适配器并将原始序列化替换为更易于反序列化的形式会容易得多(例如,您可以使用XStream将对象转换为XML表示形式)

09-11 06:23
查看更多