vuelva variable una tipos serializacion readobject que puedo prevenir miembro guardar deserializacion como clase java web-services serialization date

variable - Fecha de serialización en Java



serializacion y deserializacion en java (12)

En primer lugar, si está utilizando servicios web, significa que está serializando a XML y no a su serialización habitual de Java (pero a alguna otra biblioteca para calcular y desasignar). Entonces la pregunta carece de información.

En segundo lugar, si tiene control sobre InputStream y OutputStream intente extender ObjectOutputStream y ObjectInputStream y anule replaceObject () y resolveObject () y luego puede implementar la serialización para java.sql.Date.

Estoy pasando por algunos objetos a través del servicio web y algunos de ellos contienen java.sql.Date. Debido a que Date no tiene un constructor vacío, no quiere ser serializado.

La primera parte de una pregunta es fácil: ¿cuál es la mejor manera de pasar una fecha entre el cliente y el servicio?

La segunda parte es un poco más complicada: una vez que decido cómo pasar fechas, obviamente puedo declarar la fecha transitoria y hacer una clase contenedora para pasar fechas como Cadena o lo que sea, pero cómo aplicar la misma solución lo más transparente posible a varias clases que incluyen Fecha ?

(Tengo la corazonada de que la cosa DynamicProxy podría ser una solución, pero leer la documentación en el sitio de Sun no fue muy útil, así que si realmente es algo en esa dirección, se apreciarían algunas aclaraciones)

Editar: hice una pregunta incorrecta, lo siento (un malentendido entre mí y el compañero de trabajo, lo que en realidad es un problema). El problema ocurre debido a la deserialización. Entonces, una vez que tengo la fecha en formato xml, intenta deserializarse como GregorianCalendar. Otra parte de una pregunta permanece: ¿Cuál es la mejor manera de recibir algo (sello de tiempo largo o calendario Gregorian) y convertirlo a la fecha sql, sin hacer 10 envoltorios diferentes para 10 clases diferentes. Estoy usando un NetBeans para generación de código y wsdl.


He investigado la implementación de java.sql.Date y, como lo veo, java.sql.Date se puede serializar como una extensión de java.util.Date.


Hmmm ... No se puede pensar en ninguna razón por la cual cualquier instancia de objeto serializada (serializada a través del mecanismo java predeterminado) debería deserializarse como una instancia de otra clase, ya que la información de clase debería ser una parte inherente de los datos serializados.

Por lo tanto, es un problema de su marco de (des) serialización o el marco acepta cualquier objeto "similar a una fecha" en el "extremo remitente" (Calendario, java.util.Date, etc., y así java.sql.Date también como extiende java.util.Date), "lo serializa" en una cadena en algún formato de fecha común (por lo que se pierde la información del tipo) y lo "deserializa" de nuevo a un objeto de calendario en el extremo de recepción.

Así que creo que la forma más sencilla de llegar a java.sql.Date es hacer una

java.sql.Date date = new java.sql.Date(calendar.getTimeInMillis);

donde necesita un java.sql.Date pero recupere el GregorianCalendar de la "deserialización".


No necesita el constructor predeterminado (vacío) para serializar / deserializar la fecha (ya sea java.sql.Date o java.util.Date). Durante la deserialización no se llama al constructor, pero los atributos del objeto se establecen directamente en los valores de los datos serializados y puede usar el objeto tal como está, ya que se deserializó.


Para responder la primera parte de su pregunta, sugeriría una cadena en formato ISO 8601 (este es un estándar para codificar fechas).

Para la segunda parte, no estoy seguro de por qué necesitarías una clase proxy. O por qué tendrías que extender la clase de fecha para apoyar esto. p.ej. ¿su servicio web no sabría que un determinado campo es una fecha y realiza la conversión de fecha a cadena y viceversa? Necesitaría un poco más de información.


Puede usar un codificador y decodificar para serializar y deserializar sus objetos.

Aquí hay un ejemplo que serializa la clase Rectángulo SWT:

XMLEncoder encoder = new XMLEncoder(new FileOutputStream(file)); encoder.setPersistenceDelegate( Rectangle.class, new DefaultPersistenceDelegate(new String[]{"x", "y", "width", "height"})); encoder.writeObject(groups); encoder.close();


Serializar el tiempo devuelto por Date.getTime () como se sugirió anteriormente funcionará. Sin embargo, debe tener en cuenta que si su servidor está en otra zona horaria que el cliente, la fecha que reconstruirá en el otro lado será diferente. Si desea reconstruir el mismo objeto de fecha exacta, también debe enviar su zona horaria (TimeZone.getID ()) y utilizarla para reconstruir la fecha en el otro lado.


Una advertencia con java.sql.Date que me mordió recientemente es que no almacena las porciones de tiempo (horas, minutos, segundos, etc.) solo la parte de la fecha. si quieres la marca de tiempo completa, tienes que usar java.util.Date o java.sql.Timestamp


java.sql.Date extiende java.util.Date

Simplemente use getTime () para obtener el valor largo de la misma. Esto se puede serializar y se puede construir un nuevo java.sql.Date (long) o un nuevo java.util.Date (long) en el otro extremo.


java.sql.Date ya implementa Serializable, por lo que no es necesario implementarlo :-)

En lo que respecta a su pregunta principal, estoy profundamente enamorado de JAXB, ya que puedo convertir casi cualquier XML en un objeto, por lo que podría valer la pena examinarlo.


Joda-Time

La clase Date tiene una API torpe. Una mejor implementación es Joda-Time .

ISO 8601

Joda-Time también le permite convertir su fecha en un formato estándar ISO 8601 (aaaa-mm-ddTHH: MM: SS.SSS). El uso de este estándar al mover las fechas del servidor a su cliente tiene la ventaja de incluir la fecha completa en un formato legible. Cuando utiliza, por ejemplo, JAXB , la representación XML de una fecha es también esta norma ISO. (ver la clase XMLGregorianCalendar)


Expandiré la respuesta correcta de JeroenWyseur.

ISO 8601

El formato estándar ISO 8601 es absolutamente la mejor manera de serializar un valor de fecha y hora para el intercambio de datos. El formato no es ambiguo, es intuitivo para las personas de todas las culturas y cada vez es más común en todo el mundo. Fácil de leer para humanos y máquinas.

2015-01-16T20:15:43+02:00 2015-01-16T18:15:43Z

El primer ejemplo tiene un desplazamiento de dos horas por delante de UTC. El segundo ejemplo muestra el uso común de Z ("Zulu") para indicar UTC, abreviatura de +00:00 .

Joda-Time y java.time

Las clases java.util.Date y .Calendar incluidas con Java son notoriamente problemáticas, confusas y defectuosas. Evítales. En su lugar, use cualquiera de estos

  • Biblioteca Joda-Time
  • paquete java.time, integrado en Java 8, inspirado en Joda-Time, definido por JSR 310.

De forma predeterminada, ambas bibliotecas usan ISO 8601 para analizar y generar representaciones de cadena de valores de fecha y hora.

Tenga en cuenta que java.time amplía el formato ISO 8601 al agregar el nombre propio de la zona horaria , como 2007-12-03T10:15:30+01:00[Europe/Paris] .

Busque .com para cientos de preguntas y respuestas con mucha discusión y código de ejemplo para ambas bibliotecas.

Evitar el recuento de la época

Algunas de las otras respuestas recomiendan usar un número, un conteo de época . Este enfoque no es práctico. No es evidente por sí mismo. No es legible por el ser humano, lo que hace que la depuración sea problemática y frustrante.

¿Qué número es, segundos enteros como se usa comúnmente en Unix, milisegundos utilizados en java.util.Date y Joda-Time, microsegundos comúnmente utilizados en bases de datos como Postgres, o nanosegundos utilizados en el paquete java.time ?

¿Cuál de las doce docenas de épocas , primer momento de 1970 utilizado en Unix, año 1 utilizado en .Net & Go, "0 de enero de 1900" utilizado en millones (miles de millones?) De hojas de cálculo Excel & Lotus, o el 1 de enero de 2001 utilizado por ¿ Cacao ?

Vea mi respuesta en una pregunta similar para más discusión.