[Juicio nulo de objeto + problema de zona horaria + acarreo de fecha en formato de cadena + serialización y deserialización]

1. Juicio de objeto

public static boolean isEmpty(Object value) {
    
    
    if (value == null) {
    
    
        return true;
    } else if (value instanceof String) {
    
    
        return ((String)value).length() == 0;
    } else if (value instanceof Collection) {
    
    
        return ((Collection)value).size() == 0;
    } else if (value instanceof Map) {
    
    
        return ((Map)value).size() == 0;
    } else if (value instanceof String[]) {
    
    
        return ((String[])((String[])value)).length == 0;
    } else {
    
    
        return false;
    }
}

instancia de: una palabra clave reservada en Java. Su función es probar si el objeto de su izquierda es una instancia de la clase de su derecha y devolver un tipo de datos booleano. instancia de se usa generalmente para la coerción de tipos de objetos. instancia de es un operador binario en Java, con objetos a la izquierda y clases a la derecha.
Las instancias de una clase incluyen su propia instancia, así como las instancias de todas las subclases directas o indirectas
instancia de. El tipo declarado explícitamente a la izquierda y el operando a la derecha deben ser del mismo tipo o tener una relación de herencia, lo que significa que necesitan estar en el mismo árbol de herencia, de lo contrario se compilará un error

uso:

  1. La instancia del objeto de la izquierda no puede ser un tipo de datos básico.
  2. La instancia del objeto de la izquierda y la clase de la derecha no están en el mismo árbol de herencia.
  3. Al comparar nulo con cualquier tipo usando instancia de, siempre será falso.

2. Problemas de zona horaria

Problema: Al insertar datos en la base de datos, se encontró que algunos datos se insertaron en el momento incorrecto. La
causa final fue: problema de horario de verano.
Solución: Agregar restricciones de zona horaria al declarar el campo de fecha, y la zona horaria es la Zona horaria de Shanghái.

@JsonFormat(pattern = "yyyyMMdd", timezone = "Asia/Shanghai")

3. Llevar la fecha en formato de cadena.

Redondeado por minutos:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
LocalDateTime localDateTime = LocalDateTime.parse(String.valueOf(i), dtf);
LocalDateTime plus = localDateTime.plus(i, ChronoUnit.MINUTES);
String format = dtf.format(plus);
int i = Integer.parseInt(format);

4. Una breve discusión sobre cómo llamar a paquetes jar de terceros.

El paquete jar de terceros es solo una clase de herramienta y sus dependencias no serán muy fuertes.
Tome puntos de interrupción en negrita para encontrar la causa del error.
En ese momento, se produjo una excepción de puntero nulo durante la llamada y no miré la llamada con atención.
Una excepción de puntero nulo como esta significa que no hay ningún valor asignado en alguna parte. Mire con atención, luego asigne un valor y ¡listo! ! !

El código emitido es el código de realización en ese momento:

package cn.hsa.bis;

import cn.hsa.bis.api.psnDataSyncTencent.dto.PsnBasInfoQueryDTO;
import cn.hsa.hsaf.core.gateway.*;
import cn.hsa.hsaf.tencent.gateway.RioApiCaller;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

public class TencentTest {
    
    

    public static void main(String[] args) {
    
    
// 因为是一个测试类,已经不能调用配置文件和依赖注入的类了,所以需要的东西要自己new,并且参数也要自己赋值;这是需要看调用的第3方jar包看到的。
        RioApiCaller rioApiCaller = new RioApiCaller();
        rioApiCaller.setPaasid("hsa_bic");
        rioApiCaller.setToken("T6t2Q7i9rPukJhuPc6ogvXt2qNe5LWfB");
        rioApiCaller.setGatewayUrl("http://10.97.240.206:80/ebus");
        rioApiCaller.setName("rioApiCaller");
        rioApiCaller.init();  // 当时没有调用这个初始化方法,一直报空指针异常。

        PsnBasInfoQueryDTO psnBasInfoQueryDTO = new PsnBasInfoQueryDTO();
        psnBasInfoQueryDTO.setPsnMgtcode(args[0]);
        String jsonData = JSON.toJSONString(psnBasInfoQueryDTO);
        ContentBody cb = new ContentBody(jsonData);
        HttpParameters hp = HttpParameters.newBuilder()
                .api("/hsa-bic-nation-psnbasinfoservicee-queryPsnInfoByQueryDTO/")
                .version("1.0.0")
                .method("POST")
                .contentBody(cb)
                .build();
        Map<String, String> extMap = new HashMap<String, String>();
        String result = null;
        try {
    
    
            result = rioApiCaller.invoke(hp, extMap);
        } catch (ApiCallerException e) {
    
    
            e.printStackTrace();
        }
        System.out.println(result);
    }
}

5. Serialización y deserialización

1. Definición:
Serialización: El proceso de convertir objetos Java en secuencias de bytes (binario).
Deserialización: el proceso de restaurar una secuencia de bytes en un objeto Java.

2. Función:
La función más importante de la serialización es garantizar la integridad y capacidad de entrega de los objetos al transferirlos y guardarlos. El objeto se convierte en un flujo ordenado de bytes para transmitirlo a través de la red o guardarlo en un archivo local.

La función más importante de la deserialización: reconstruir el objeto mediante la deserialización en función del estado del objeto y la información de descripción guardada en el flujo de bytes.

Resumen: la función principal es guardar y reconstruir el estado del objeto (el punto central de todo el proceso es el estado del objeto y la información de descripción guardada en el flujo de bytes)

Nota: La serialización es el proceso de convertir el estado del objeto a un formato que pueda mantenerse o transmitirse. Lo opuesto a la serialización es la deserialización, que convierte una secuencia en un objeto. Estos dos procesos se combinan para almacenar y transferir datos fácilmente. JSON es el formato utilizado para el intercambio de datos de la interfaz.

Transmisión de datos json/xml:
antes de la transmisión de datos (también llamada transmisión de red), los objetos Java se serializan en archivos json/xml a través de la clase de herramienta de serialización.
Después de la transmisión de datos (también llamada transmisión de red), el archivo json/xml se deserializa en un objeto en el idioma correspondiente.

3. ¿Por qué se necesitan la serialización y la deserialización
? Sabemos que cuando dos procesos se comunican de forma remota, pueden enviarse varios tipos de datos entre sí, incluidos texto, imágenes, audio, video, etc., y estos datos estarán en forma de secuencias binarias transmitidas a través de la red.

Entonces, cuando dos procesos Java se comunican, ¿se puede lograr la transferencia de objetos entre procesos? ¡La respuesta es sí! ¿Cómo hacerlo? ¡Esto requiere serialización y deserialización de Java!

En otras palabras, por un lado, el remitente necesita convertir el objeto Java en una secuencia de bytes y luego transmitirlo a la red; por otro lado, el receptor necesita recuperar el objeto Java a partir de la secuencia de bytes.

Cuando entendemos por qué se necesita la serialización y deserialización de Java, naturalmente pensamos en los beneficios de la serialización de Java. La primera ventaja es que logra la persistencia de los datos. A través de la serialización, los datos se pueden guardar permanentemente en el disco duro (generalmente almacenados en un archivo), la segunda es que la serialización se utiliza para lograr la comunicación remota, es decir, los bytes. del objeto se transmiten a través de la red.

En términos generales, se puede resumir en los siguientes puntos:

  1. Guarde permanentemente la secuencia de bytes del objeto en el disco duro, generalmente en un archivo; (objeto persistente)
  2. Una secuencia de bytes que transmite un objeto a través de la red. (Objeto de transferencia de red)
  3. Pasar objetos entre procesos mediante serialización;

4. En Java, si un objeto quiere ser serializado, debe implementar una de las dos interfaces siguientes:

Interfaz serializable
Si un objeto quiere ser serializado, su clase debe implementar esta interfaz o su subinterfaz.
Todos los atributos de este objeto (incluidos los atributos privados y los objetos a los que hace referencia) se pueden serializar y deserializar para guardarlos y transferirlos. Los campos que no quieran serializarse se pueden modificar mediante transitorio.
Dado que el objeto Serializable se construye enteramente en base a los bits binarios que almacena, no se llama a ningún constructor. Por lo tanto, la clase Serializable no necesita un constructor predeterminado. Sin embargo, cuando la clase principal de la clase Serializable no implementa la interfaz Serializable, el El proceso de deserialización llamará al constructor predeterminado de la clase principal, por lo que la clase principal debe tener un constructor predeterminado; de lo contrario, se generará una excepción.
Aunque es simple y conveniente usar la palabra clave transitoria para evitar la serialización, el atributo modificado por ella está completamente aislado del mecanismo de serialización, lo que hace que el valor del atributo no se pueda obtener durante la deserialización. Agregar el método writeObject() y El método readObject() de la clase Java puede controlar cómo serializar cada atributo, e incluso no serializar ciertos atributos en absoluto o cifrar y serializar ciertos atributos.

Interfaz externalizable
Es una subclase de la interfaz serializable. Los métodos writeExternal () y readExternal () que los usuarios deben implementar se utilizan para determinar cómo serializar y deserializar.
Debido a que usted mismo debe implementar los métodos de serialización y deserialización, puede especificar qué propiedades serializar, y transitorio no es válido aquí.
Al deserializar un objeto externalizable, primero se llamará al constructor sin parámetros de la clase, que es diferente del método de deserialización predeterminado. Si elimina el constructor sin parámetros de la clase, o establece el permiso de acceso del constructor a nivel privado, predeterminado o protegido, se generará una excepción java.io.InvalidException: no válida del constructor, por lo que el objeto externalizable debe tener un valor predeterminado. Función constructora y debe ser pública.
Uso:
solo desea ocultar un atributo, como la contraseña pwd del usuario del objeto de usuario. Si usa Externalizable y escribe todos los atributos excepto pwd en el método writeExternal(), esto parece problemático. Puede usar la interfaz Serializable y agregar it in Esto se puede lograr agregando transitorio delante del atributo pwd que se va a ocultar. Si desea definir una gran cantidad de procesamiento especial, puede utilizar Externalizable.
El método writeObject () y el método readObject () en Serializable pueden implementar una serialización personalizada, y los métodos writeExternal () y readExternal () en Externalizable también se pueden usar.¿Cuáles son las similitudes y diferencias entre ellos?
Hay dos métodos, readExternal () y writeExternal (). Excepto por las firmas de los métodos de los dos métodos y las firmas de los métodos readObject () y writeObject (), sus cuerpos de métodos son exactamente los mismos.
Cabe señalar que cuando se utiliza el mecanismo externalizable para deserializar un objeto, el programa utilizará un constructor público sin parámetros para crear una instancia y luego ejecutará el método readExternal () para deserializar, por lo que la clase de serialización que implementa externalizable debe proporcionar información pública. Construcción sin argumentos.
Aunque la implementación de la interfaz externalizable puede traer ciertas mejoras de rendimiento, la implementación de la interfaz externalizable aumenta la complejidad de la programación, por lo que la mayoría de las veces la serialización se implementa implementando la interfaz serializable.

5. Versión de serialización ---- campo serialVersionUID
Durante el proceso de serialización, se puede controlar la versión serializada. Este campo es el campo serialVersionUID en el objeto serializado.

Para los datos de un objeto, durante el proceso de deserialización, si el serialVersionUID en la cadena de serialización es diferente del valor del objeto actual, la deserialización falla; de lo contrario, se realiza correctamente.
Si serialVersionUID no se genera explícitamente, el sistema generará uno automáticamente. Las entradas generadas incluyen: nombre de clase, clase y sus modificadores de atributos, interfaces y orden de las interfaces, atributos, inicialización estática y constructores. Los cambios en cualquier elemento harán que cambie serialVersionUID.
Los cambios en los atributos provocarán cambios en el serialVersionUID generado automáticamente. Por ejemplo, para el objeto A, generamos S (A) serializado y luego modificamos los atributos de A. En este momento, el serialVersionUID de A cambia. Durante la deserialización, el serialVersionUID de S(A) es diferente del de A y no se puede deserializar. Se informará un error de versión del número de serie inconsistente.
Para evitar este problema, el sistema general requerirá clases que implementen la interfaz serializable para generar explícitamente un serialVersionUID. Hay dos usos para definir explícitamente
serialVersionUID:
cuando desea que diferentes versiones de una clase sean compatibles con la serialización, debe asegurarse de que diferentes versiones de la clase tengan el mismo serialVersionUID;
cuando no desea que diferentes versiones de la clase sean compatible con la serialización, debe asegurarse de que las diferentes versiones de la clase tengan un serialVersionUID diferente.
Si mantenemos el serialVersionUID consistente, durante la deserialización, el valor predeterminado nulo (el valor predeterminado de int es 0) se completará para los campos recién agregados y los campos reducidos se ignorarán directamente.

Supongo que te gusta

Origin blog.csdn.net/m0_46459413/article/details/128802417
Recomendado
Clasificación