2015-11-23 2 views
0

Я получаю следующее исключение notSerializableException, хотя класс Hub реализует сериализуемый. Это происходит, когда я пытаюсь записать файл с помощью ObjectOutputStream. Мой проект содержит слишком много классов, чтобы размещать его здесь достаточно, поэтому меня больше интересуют другие причины, которые могут возникнуть для этой ошибки, кроме класса, не реализующего Serializable. Еще одна загадочная вещь заключается в том, что я не пишу объект класса Hub в файл, я пишу ArrayList объектов из совершенно другого класса, который также реализует сериализуемый.java.io.NotSerializableException, когда класс реализует Serializable

java.io.NotSerializableException: bikescheme.Hub$1 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.writeObject(Unknown Source) 
at java.util.ArrayList.writeObject(Unknown Source) 
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.writeObject(Unknown Source) 
at java.util.ArrayList.writeObject(Unknown Source) 
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) 
at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.writeObject(Unknown Source) 
at java.util.ArrayList.writeObject(Unknown Source) 
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source) 
at java.io.ObjectOutputStream.writeSerialData(Unknown Source) 
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
at java.io.ObjectOutputStream.writeObject(Unknown Source) 
at bikescheme.Database.updateStations(Database.java:366) 
at bikescheme.Database.addStation(Database.java:235) 
at bikescheme.Hub.addDStation(Hub.java:148) 
at bikescheme.HubTerminal.addDStation(HubTerminal.java:71) 
at bikescheme.HubTerminal.receiveEvent(HubTerminal.java:52) 
at bikescheme.EventDistributor.sendEvent(EventDistributor.java:75) 
at bikescheme.EventDistributor.sendEvents(EventDistributor.java:98) 
at bikescheme.SystemTest.runTestAndReturnResults(SystemTest.java:359) 
at bikescheme.SystemTest.runAndCheck(SystemTest.java:341) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:33) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
+0

Имеет ли ваш класс Hub переменные типа ссылочного типа, которые не могут быть сериализованы? – JayC667

+3

Класс 'bikescheme.Hub $ 1' не является сериализуемым. Это должен быть первый анонимный внутренний класс в Hub.java. – Thilo

+0

Можно ли разместить весь код для 'bikescheme.Hub'? Мы можем показать вам, где находится анонимный класс. –

ответ

3

Похоже, у вас есть анонимный внутренний объект класса, который не сериализации (bikscheme.Hub $ 1):

java.io.NotSerializableException: bikescheme.Hub $ 1

+0

Что такое анонимный внутренний класс? У меня есть экземпляр класса singleton, но он также реализует serializable. – Alk

+1

@mankee, если вы не знаете, что такое внутренний класс, тогда я думаю, вам нужно больше узнать основы Java, прежде чем решать сериализацию. –

+0

Я знаю, что такое внутренний класс, я никогда не сталкивался с анонимным классом tho – Alk

0

Это должно ответить на все вопросы:

public class BadSerializingClass implements Serializable { 

    class ThisIsNotOK {} // comment out, it'll work 

    class ThisIsOk implements Serializable {} 

    // MVs 
    ThisIsNotOK m1 = new ThisIsNotOK(); // comment out, it'll work 
    ThisIsOk m2 = new ThisIsOk(); 

    Runnable innerAnonymousClass = new Runnable() { // comment out, it'll work 
     @Override public void run() { 
      System.out.println("Hello"); 
     } 
    }; 

    public static void main(final String[] args) throws FileNotFoundException, IOException { 
     final BadSerializingClass s = new BadSerializingClass(); 
     final ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("test.dat")); 
     oos.writeObject(s); 
     System.out.println("All OK"); 
    } 

} 
+0

Проблема заключается в том, что мой внутренний класс ссылается так: 'Clock.getInstance(). ScheduleNotification ('. На самом деле это не определено внутри класса Hub ... Я уже добавил, что Clock Clocks реализует serializable' в файле Clock.java, но это не помогло – Alk

+0

Если вы не можете сделать это Serializable, у вас есть два варианта: 1) дать переменной ключевое слово transient => Java не будет пытаться его сериализовать 2) использовать пользовательскую сериализацию: http://www.oracle .com/technetwork/искусство icles/java/javaserial-1536170.html – JayC667

+0

Я добавил 'private transient Clock clock = Clock.getInstance();' и удалил объекты Serializable. Теперь я получаю несериализуемое исключение на bikeScheme.Clock – Alk

0

Добавление transient ко всем экземплярам Clock в рамках проекта решил эту проблему.

Смежные вопросы