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)
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
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();
2. 未声明可序列化的超类或接口
NotSerializableException
。class NotSerializable { // ... } class MyClass extends NotSerializable implements Serializable { // ... }
3. 拒绝访问或非法反射
private
访问修饰符的 writeObject
和 readObject
方法。反射访问这些方法会导致 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);
4. 静态字段的序列化
transient
)。class MyClass implements Serializable { private static String staticField; private String instanceField; // ... }
5. 可变或循环引用
StackOverflowException
// 可变对象 class MyClass implements Serializable { private int mutableField; // ... } // 循环引用 class MyClass1 implements Serializable { private MyClass myClass2; class MyClass2 implements Serializable { private MyClass1 myClass1; } }
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. 🎜🎜rrreeeCe 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!