Java-File-Serialization-java.io.StreamCorruptedException: código de tipo no válido: AC

java.io.StreamCorruptedException: código de tipo no válido: problema de CA resuelto

Descripción del problema:

Cada vez que serializa un objeto en un archivo, solo desea agregar el objeto al final del archivo en lugar de sobrescribirlo. Puede usar FileInputStream (nombre de archivo, verdadero); al leer datos, se leerán normalmente por primera vez. Informará un error y, cuando se lea por segunda vez, informará java.io.StreamCorruptedException: código de tipo no válido: error de CA.

Análisis de problemas:
dado que FileInputStream (nombre de archivo, verdadero) se usa para serializar objetos en el mismo archivo, se serializa un encabezado en el archivo cada vez. Al deserializar, cada objeto ObjectInputStream solo leerá un encabezado, luego, cuando encuentre el segundo, se informará un error, lo que dará como resultado una excepción.

solución:

Hay tres métodos en total, se recomienda el segundo;

1. Usar colección:

Antes de serializar el objeto por primera vez, agregue el objeto a serializar a la colección y serialice la colección en el archivo. Luego, antes de cada serialización, además de agregar el objeto a serializar a la colección, la colección serializada se deserializa nuevamente y se agrega a la colección, y luego la colección se serializa en el archivo.

2. Vuelva a escribir el método writeStreamHeader () de ObjectOutputSream:

判断是不是第一次写入,若是则写入头部,若不是则不写入头部

/**
重写writeStreamHeader()方法
*/
class MyObjectOutputStream  extends ObjectOutputStream{

    public MyObjectOutputStream(OutputStream out) throws IOException {
        super(out);
    }

    public void writeStreamHeader() throws IOException{
        return;
    }
}

public class SerializableDemo01{
    //main方法
    public static void main(String[] args) throws Exception {
        File file = new File(".\\b.txt");
        Person p = new Person("lisi",19);
        set(file,p);
        List<Person> list = get(file);
        for(Person per:list){
            System.out.println(per);
        }
    }
    //序列化
    public static void set(File file,Person p) throws Exception{
        FileOutputStream fos = new FileOutputStream(file,true);
        /**
        判断是否是第一次写入
        */
        if(file.length()<1){
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(p);
            oos.close();
        }else{
            MyObjectOutputStream mos = new MyObjectOutputStream(fos);
            mos.writeObject(p);
            mos.close();
        }
    }

    //反序列化
    public static List<Person> get(File file) throws Exception{
        List<Person> list = new ArrayList<Person>();
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        while(fis.available()>0){
            Person p = (Person) ois.readObject();
            list.add(p);
        }
        ois.close();
        return list;
    }
}

Tres: No reescriba el método writeStreamHeader () de ObjectOutputSream. En el ciclo while de deserialización, se crea un nuevo ObjectInputStream cada vez para leer el encabezado (recomendado)

public class SerializableDemo03{
    public static void main(String[] args) throws Exception {
        File file = new File(".\\c.txt");
        Person p = new Person("lisi",19);
        set(file,p);
        List<Person> list = get(file);
        for(Person per:list){
            System.out.println(per);
        }
    }

    public static void set(File file,Person p) throws Exception{
        FileOutputStream fos = new FileOutputStream(file,true);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(p);
        oos.close();
    }

    public static List<Person> get(File file) throws Exception{
        List<Person> list = new ArrayList<Person>();
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = null;
        while(fis.available()>0){
            //每次都new一个新的ObjectInputStream
            ois = new ObjectInputStream(fis);
            Person p = (Person) ois.readObject();
            list.add(p);
        }
        ois.close();
        return list;
    }
}

Reimpresión:
Declaración de derechos de autor: Este artículo es el artículo original del blogger y sigue el acuerdo de derechos de autor CC 4.0 BY-SA. Adjunte el enlace de la fuente original y esta declaración para reimprimir.
Enlace a este artículo: https://blog.csdn.net/mingyang_2016/article/details/75208117

Supongo que te gusta

Origin blog.csdn.net/huiguo_/article/details/109014518
Recomendado
Clasificación