Pergunta

O log4j adaptador de rede envia eventos como serialised objeto java.Eu gostaria de ser capaz de capturar este objeto e deserialise-lo em um idioma diferente (python).Isso é possível?

NOTA A rede de captura é fácil;é apenas um soquete TCP e leitura em um córrego.A dificuldade é a parte deserialising

Foi útil?

Solução

Geralmente, não.

O formato de fluxo para a serialização de Java é definida neste documento, mas você precisa ter acesso ao original definições de classe (e em tempo de execução Java para carregá-los em) para ativar o fluxo de dados de volta para algo próximo de objetos originais.Por exemplo, as aulas podem definir writeObject() e readObject() métodos para personalizar a sua própria forma serializada.

(editar: lubos hasko sugere a ter um pouco de programa em java para anular a serialização de objetos na frente do Python, mas o problema é que para isso funcionar, o seu "pequeno programa em java" precisa de carregar as mesmas versões de todas as classes que pode anular a serialização.O que é complicado se você estiver recebendo mensagens de log a partir de um aplicativo, e realmente complicado se você está multiplexação mais do que um fluxo de log.De qualquer forma, não vai ser um programa pouco mais. edit2: Eu poderia estar errado aqui, eu não sei o que é serializado.Se é apenas classes log4j você deve ser fino.Por outro lado, é possível fazer arbitrário exceções, e se conseguir colocar na sequência bem o meu ponto de vista está.)

Seria muito mais fácil para personalizar o log4j adaptador de rede e substituir as matérias de serialização com alguns mais facilmente anular a serialização de formulário (por exemplo, você poderia usar XStream para transformar o objeto em uma representação XML)

Outras dicas

Teoricamente, é possível.A Serialização de Java, como praticamente tudo na Javaland, é padronizado.Então, você poderia implementar um desserializador de acordo com que padrão em Python.No entanto, o formato de Serialização de Java não é projetado para cross-uso da linguagem, o formato de serialização está intimamente ligada à forma como os objetos são representados dentro da JVM.Ao implementar uma JVM em Python é certamente um exercício divertido, é provavelmente o que você está procurando (-:

Há outras (dados) formatos de serialização, que são projetados especificamente para ser o idioma agnóstico.Eles geralmente trabalham por descascar os formatos de dados para baixo para o mínimo (número, seqüência de caracteres, de sequência, de dicionário e o que é) e por isso requer um pouco de trabalho em ambas as extremidades para representar um objeto rico como um gráfico de mudo estruturas de dados (e vice-versa).

Dois exemplos são JSON (JavaScript Object Notation) e YAML (YAML Ain't Markup Language).

ASN.1 (Abstract Syntax Notation One) é outro formato de serialização de dados.Em vez de nivelamento o formato para baixo para um ponto onde ele pode ser facilmente compreendido, ASN.1 é auto-descritivo, ou seja, todas as informações necessárias para decodificar um fluxo é codificado dentro do fluxo em si.

E, é claro, XML (eXtensible Markup Language), vai funcionar também, desde que ele não é apenas usado para fornecer a representação textual de um "despejo de memória" de um objeto Java, mas um real abstrato, independente de idioma codificação.

Então, para fazer uma longa história curta:sua melhor aposta é a de tentar coagir o log4j em log em um dos formatos acima mencionados, substituir o log4j com algo que faz ou para de alguma forma tentar interceptar os objetos antes que eles são enviados pela rede e convertê-los antes de sair Javaland.

Bibliotecas que implementam JSON, YAML, ASN.1 e XML estão disponíveis para Java e Python (e praticamente toda linguagem de programação conhecida para o homem).

Eu recomendaria movendo-se para um terceiro formato (por criar o seu próprio log4j adaptadores, etc) que ambas as línguas entender e pode facilmente empacotar / desempacotar, e.g.XML.

Em teoria é possível.Agora, como é difícil, na prática, pode ser depende do formato de serialização de Java é documentado ou não.Eu acho, não. editar: opa, eu estava errado, graças Charles.

De qualquer maneira, isso é o que eu sugiro que você faça

  1. a captura do log4j & anular a serialização de objeto Java em seu próprio pequeno programa em Java.

  2. agora, quando você tem o objeto novamente, serializá-lo a utilizar o seu próprio formatador personalizado.

    Dica: Talvez você não tem que escrever o seu próprio formatador personalizado.por exemplo, JSON (rolar para baixo para libs) tem bibliotecas para Python e Java, então você pode, em teoria, usar a biblioteca Java para serializar os objetos e Python equivalente biblioteca para anular a serialização é

  3. enviar fluxo de saída para a sua aplicação em python e anular a serialização é

Charles escreveu:

o problema é que para este para trabalhar, o seu "pequeno programa em java" necessidades para carregar as mesmas versões de todos os as mesmas classes que pode anular a serialização.O que é complicado se você estiver receber mensagens de log a partir de um aplicativo, e realmente complicado se você estiver multiplexação por mais de um fluxo de log.De qualquer forma, não vai ser um programa pouco mais.

Você não pode simplesmente fazer referência Java log4j bibliotecas em seu próprio java processo?Estou apenas a dar conselhos gerais, aqui, que é aplicável para qualquer par de línguas (nome da pergunta é muito idioma agnóstico, então eu só proporcionou uma das soluções genéricas).De qualquer maneira, eu não estou familiarizado com o log4j e não sei se você pode "injetar" o seu próprio serializador para ele.Se você pode, então, naturalmente, a sua sugestão é muito melhor e mais limpo.

Bem, eu não sou Python especialista, então eu não posso comentar sobre como resolver o seu problema, mas se você tiver o programa em .NET, você pode usar IKVM.NET anular a serialização de objetos Java facilmente.Eu experimentei esta criando .Rede Cliente para o Log4J log de mensagens escritas para o Socket appender e funcionou muito bem.

Me desculpe, se esta resposta não faz sentido aqui.

Se você pode ter uma JVM no lado da recepção e as definições de classe para os dados serializados, e você só quer usar o Python e nenhum outro idioma e, em seguida, você pode usar Standards:

  • você iria anular o que você recebeu usando o correto Java métodos
  • e, em seguida, processar o que você ganha com o que você Python de código
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top