2012-02-23 4 views
4

я следующий класс:Почему мой класс не сериализуем?

import java.awt.Color; 
import java.util.Vector; 

public class MyClass { 

    private ImageSignature imageSignature; 

    private class ImageSignature implements Serializable { 
     private static final long serialVersionUID = -6552319171850636836L; 
     private Vector<Color> colors = new Vector<Color>(); 

     public void addColor(Color color) { 
      colors.add(color); 
     } 

     public Vector<Color> getColors() { 
      return colors; 
     } 
    } 

    // Will be called after imageSignature was set, obviously 
    public String getImageSignature() { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(baos); 
     oos.writeObject(imageSignature); 
     oos.close(); 
     return String(Base64Coder.encode(baos.toByteArray())); 
    } 
} 

Когда я пытаюсь вызвать getImageSignature(), я получаю NotSerializableException - Почему это? Все члены сериализуемы, так почему я могу получить эту ошибку?

+0

Является ли цвет типа java.awt.Color? – Lars

+0

'java.awt.Color' и' java.util.Vector' –

+4

Протестировал ваш код, и он работал без проблем. Вы очистили и перестроили полный проект перед запуском? –

ответ

14

Каждый экземпляр ImageSignature имеет неявную ссылку на прилагаемый экземпляр MyClass, а MyClass не является сериализуемым.

Либо сделать MyClass сериализации, или объявить ImageSignature статическими:

private static class ImageSignature implements Serializable { 
+0

Вы хотите сказать, что сам класс статичный или 'private' свойство' MyClass'? –

+0

@FlorianPeschka: Я имею в виду 'private static class ImageSignature реализует Serializable {...' – NPE

1

Проверьте ниже информацию от Java Serialization Spec:

Примечание - Сериализация внутренних классов (то есть, вложенные классы, которые не статические классы-члены), включая локальные и анонимные классы, сильно обескуражен по нескольким причинам. Поскольку внутренние классы , объявленные в нестатических контекстах, содержат неявные непереходные ссылки на охватывающие экземпляры класса, сериализация такого внутреннего экземпляра класса приведет к сериализации его связанного внешнего экземпляра класса . Синтетические поля, созданные javac (или другими компиляторами JavaTM) для реализации внутренних классов - это реализация зависимая и может различаться между компиляторами; различия в таких полях могут нарушить совместимость, а также привести к конфликтующим значениям по умолчанию serialVersionUID. Имена, назначенные локальным и анонимным внутренним классам , также зависят от реализации и могут отличаться от компиляторов. Поскольку внутренние классы не могут объявлять статические члены другим , чем поля константы времени компиляции, они не могут использовать механизм serialPersistentFieldsдля обозначения сериализуемых полей. Наконец, поскольку внутренние классы, связанные с внешними экземплярами, не имеют , имеют конструкторы с нулевым аргументом (конструкторы таких внутренних классов неявно принимают экземпляр-экземпляр в качестве предварительного параметра), они не могут реализовать Externalizable. Однако ни одна из перечисленных выше проблем, , применима к статическим классам-членам.

1

Для того, чтобы класс Serializable вы должны реализовать Serlizable интерфейса, интерфейс маркеров или тегов, которые не имеют какую-либо методы так объект вашего класса должен seralize

private static class ImageSignature implements Serializable {// code } 
Смежные вопросы