Pregunta

Estoy usando Java 1.4 con Log4J.

Algunos de mi código implica serializar y deserializar objetos de valor (POJOs).

Cada uno de mis POJOs declara un registrador con

private final Logger log = Logger.getLogger(getClass());

El serializador se queja de la org.apache.log4j.Registrador de no ser Serializable.

Debo usar

private final transient Logger log = Logger.getLogger(getClass());

en su lugar?

¿Fue útil?

Solución

Cómo sobre el uso de una estática registrador?O usted necesita un registrador diferente de referencia para cada instancia de la clase?Los campos estáticos no son serializados por defecto;usted puede declarar explícitamente los campos para serializar un privado, estática, final de la matriz de ObjectStreamField nombre serialPersistentFields. Consulte la documentación de Oracle

Contenido agregado:Como utilizar getLogger(getClass()), usted tendrá que usar el registrador en cada instancia.Si desea utilizar un registrador para cada instancia que se tienen que diferenciar en el nombre de la bitácora en la getLogger() -método.por ejemplo,getLogger(getClass().getName() + hashCode()).A continuación, usted debe utilizar el transitorio atributo para asegurarse de que el registrador no se serializan.

Otros consejos

El registrador debe ser estática;esto haría que no serializable.

No hay ninguna razón para hacer registrador no estática, a menos que haya una razón fuerte para hacerlo.

Si realmente quiero ir a la transitoria enfoque tendrá que restablecer el registro cuando el objeto se deserializa.La manera de hacerlo es aplicar el método:

 private void readObject(java.io.ObjectInputStream in) 
   throws IOException, ClassNotFoundException;

Los javadocs para Serializable tiene información sobre este método.

Su implementación se verá algo como:

 private void readObject(java.io.ObjectInputStream in) 
     throws IOException, ClassNotFoundException {
   log = Logger.getLogger(...);
   in.defaultReadObject();
 }

Si no lo hace, a continuación, el registro será nulo después de deserializar el objeto.

Declarar su campo de registrador como estático o como transitoria.

Ambas formas de garantizar la writeObject() método no intenta escribir en el campo de la secuencia de salida durante la serialización.

Generalmente registrador de campos se declaró estática, pero si usted lo necesita para ser un campo de instancia sólo declarar transitoria, como normalmente se hace para cualquier no serializable campo.Sobre la serialización de la bitácora de campo será nulo, aunque, por lo que tienen que implementar un readObject() método para inicializar correctamente.

Trate de hacer el Registrador de estática en su lugar.Que usted no tiene cuidado acerca de la serialización porque es manejado por la clase loader.

Estos tipos de casos, sobre todo en EJB, son generalmente los mejores manejan a través del subproceso de estado local.Normalmente el caso de uso es algo como que tiene una transacción en particular, que se enfrenta a un problema y que necesita elevar el registro de depuración para que la operación de modo que puede generar un registro detallado sobre el problema de la operación.Llevar el hilo del estado local, a través de la transacción y el uso que seleccionar la correcta registrador.Francamente, yo no sé de dónde sería beneficioso para establecer el nivel en una INSTANCIA en este ambiente debido a la asignación de casos en que la transacción debe ser un contenedor de nivel de la función, en realidad no se tiene el control de la instancia que se utiliza en una determinada transacción, de todos modos.

Incluso en casos en los que usted está tratando con un DTO en general no es una buena idea para diseñar el sistema de tal manera que una determinada instancia específica es necesaria debido a que el diseño puede evolucionar en formas que hacen que una mala elección.Usted puede venir a lo largo de un mes a partir de ahora y decidir que consideraciones de eficacia (almacenamiento en caché o algún otro ciclo de vida cambiando de optimización) romper su hipótesis acerca de la asignación de casos en las unidades de trabajo.

Si desea que el Registrador por ejemplo, entonces sí, usted quiere hacer es transitorio si se va a serializar los objetos.Log4J Registradores no son serializables, no en la versión de Log4J que estoy usando de todos modos, así que si usted no hace sus Registrador de campos transitorios obtendrá excepciones en la seriación.

Los registradores no son serializables por lo que debe utilizar transitoria cuando se almacena en los campos de instancia.Si desea restaurar el registrador después de deserialización puede almacenar el Nivel (Cadena) indide de su objeto que no se serializan.

Hay buenas razones para utilizar una instancia registrador.Un muy buen caso de uso es por lo que usted puede declarar el registrador en un super-clase y usarla en todas las sub-clases (el único inconveniente es que los registros de la super-clase, se atribuye a la sub-clase, pero por lo general es fácil ver que).

(Como otros han mencionado el uso estático o transitoria).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top