Maison > Java > javaDidacticiel > le corps du texte

Quelles sont les erreurs courantes de sérialisation Java ?

王林
Libérer: 2024-04-16 18:18:01
original
809 Les gens l'ont consulté

Les erreurs courantes de sérialisation Java incluent : Conflit de version de classe (InvalidClassException) Aucune superclasse ou interface sérialisable déclarée (NotSerializingException) Accès refusé ou réflexion illégale d'un objet sérialisé (IllegalAccessException) La sérialisation des champs statiques est mutable ou cyclique Référence (StackOverflowException ou état incohérent)

Quelles sont les erreurs courantes de sérialisation Java ?

Erreurs courantes de sérialisation Java

Erreurs de sérialisation Java : Erreurs qui se produisent lors de la conversion d'un objet vers ou de la reconstruction d'un objet à partir d'un flux binaire. Cela est généralement dû aux raisons suivantes :

1. Conflit de version de classe

  • L'objet qui doit être sérialisé doit être compatible avec la version de la classe lorsque l'objet est reconstruit. En cas d'incompatibilité, une erreur InvalidClassException est générée. InvalidClassException 错误。
class MyClass implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;

    // 省略其他代码...
}

// 序列化对象后修改了 MyClass
MyClass myObject = new MyClass();
myObject.setName("John Doe");

// 将对象序列化到文件
FileOutputStream fos = new FileOutputStream("object.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(myObject);
oos.close();

// 更改 MyClass 的 serialVersionUID
MyClass.serialVersionUID = 2L;

// 从文件中读取并反序列化对象
FileInputStream fis = new FileInputStream("object.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
MyClass deserializedObject = (MyClass) ois.readObject();
ois.close();
Copier après la connexion

2. 未声明可序列化的超类或接口

  • 任何可序列化的子类都必须声明其直接超级类或实现的接口也具有可序列化性。否则,它会导致 NotSerializableException
class NotSerializable {
    // ...
}

class MyClass extends NotSerializable implements Serializable {
    // ...
}
Copier après la connexion

3. 拒绝访问或非法反射

  • 序列化的对象必须具有带有 private 访问修饰符的 writeObjectreadObject 方法。反射访问这些方法会导致 IllegalAccessException
class MyClass implements Serializable {
    private void writeObject(ObjectOutputStream oos) throws IOException {
        // ...
    }

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        // ...
    }
}

// 使用反射调用 writeObject
ObjectOutputStream oos = new ObjectOutputStream(new ByteArrayOutputStream());
oos.writeObject(myObject);
Method m = MyClass.class.getDeclaredMethod("writeObject", ObjectOutputStream.class);
m.setAccessible(true);
m.invoke(myObject, oos);
Copier après la connexion

4. 静态字段的序列化

  • 静态字段不会序列化。如果要序列化它们,请将其声明为瞬态(transient)。
class MyClass implements Serializable {
    private static String staticField;
    
    private String instanceField;

    // ...
}
Copier après la connexion

5. 可变或循环引用

  • 循环引用会导致 StackOverflowException
  • // 可变对象
    class MyClass implements Serializable {
        private int mutableField;
        
        // ...
    }
    
    // 循环引用
    class MyClass1 implements Serializable {
        private MyClass myClass2;
    
        class MyClass2 implements Serializable {
            private MyClass1 myClass1;
        }
    }
    Copier après la connexion
    🎜2. Aucune superclasse ou interface sérialisable déclarée🎜🎜🎜🎜Toute sous-classe sérialisable doit déclarer que sa superclasse immédiate ou son interface implémentée est également sérialisable. Sinon, cela provoque une NotSerializingException. 🎜🎜rrreee🎜🎜3. Accès refusé ou réflexion illégale 🎜🎜🎜🎜Les objets sérialisés doivent avoir writeObject et readObjectprivate access modifier /code> . L'accès réfléchi à ces méthodes entraîne une IllegalAccessException. 🎜🎜rrreee🎜🎜4. Sérialisation des champs statiques🎜🎜🎜🎜Les champs statiques ne seront pas sérialisés. Si vous souhaitez les sérialiser, déclarez-les comme transitoires (transient). 🎜🎜rrreee🎜🎜5. Références mutables ou circulaires 🎜🎜🎜🎜Les références circulaires peuvent provoquer une StackOverflowException. Les objets mutables peuvent conduire à un état incohérent. 🎜🎜rrreee

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal