2017-01-11 3 views
1

Я пытаюсь сериализовать объект в его конструктор, который имеет интерфейс, я объясню:сериализовать интерфейс

Это Объект Класс:

public class MyObj implements Serializable{ 
    private static final long serialVersionUID = -29238982928391L; 
    private MyCallback onMyCallback; 
    private String shortcutsText; 

    public MyObj(String shortcutsText, MyCallback onMyCallback){ 
     this.shortcutsText = shortcutsText; 
     this.onMyCallback = onMyCallback; 
    } 

    public MyCallback getOnMyCallback() { 
     return onMyCallback; 
    } 
} 

Это MyCallback интерфейс:

public interface MyCallback extends Serializable { 
    long serialVersionUID = -1306760703066967345L; 
    void onMyCallbackClickListener(); 
} 

Но когда я пытаюсь написать его (out является ObjectOutputStream):

MyCallback myCallback = new MyCallback() { 
      @Override 
      public void onMyCallbackClickListener() { 
       Toast.makeText(getApplicationContext(), "TEST!", Toast.LENGTH_LONG).show(); 
      } 
     }; 
out.writeObject(myCallback); 

Или с:

out.writeObject(new MyObj("Test", myCallback)); 

Он бросает:

java.io.NotSerializableException

ответ

1

Анонимные внутренние классы не сериализации. См. Хорошее объяснение здесь: NotSerializableException on anonymous class

+0

..so как я передаю интерфейс между двумя процессами асинхронно? .. потому что AIDL не помогает мне –

+0

Вы можете рекламировать его как настоящий класс. Затем он будет сериализуем. Но сериализация объектов Java и их передача в любом случае не очень хорошая идея. Возьмите себе инструмент привязки данных и отправьте (например) JSON. –

0

«Сериализация внутренних классов (т. Е. Вложенных классов, которые не являются статическими классами-членами), включая локальные и анонимные классы, настоятельно не рекомендуется». Таким образом, вы не можете писать так:

MyCallback myCallback = new MyCallback() { @Override public void onMyCallbackClickListener() { Toast.makeText(getApplicationContext(), "TEST!", Toast.LENGTH_LONG).show(); } };

+0

.. как я могу передать интерфейс между двумя процессами асинхронно? .. потому что AIDL не помогает мне –

0

Вы получили это исключение, потому что вы не можете сериализовать анонимный внутренний класс.

+0

.. как мне передать интерфейс между двумя процессами асинхронно? .. потому что AIDL не помогает мне –

1

interface или abstract class не может быть сериализован, только конкретный класс, который реализует java.io.Serializable и примитивные типы. Сериализация предназначена для передачи информации/данных. Даже если вы можете написать что-то вроде следующего, это не значит, что вы можете сериализовать интерфейс.

public static class MyObj implements Serializable{ 
    private static final long serialVersionUID = -29238982928391L; 

    private String text; 
    private MyCallback callback; 

    MyObj(String text, MyCallback callback){ 
     this.text = text; 
     this.callback = callback; 
    } 

    MyCallback getCallback(){ 
     return callback; 
    } 

} 

interface MyCallback extends Serializable{ 
} 

static class MyCallbackImpl implements MyCallback { 
    private static final long serialVersionUID = -19238982928391L; 
} 

public static void main(String args){ 
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
    ObjectOutputStream out = new ObjectOutputStream(byteArrayOutputStream); 

    MyCallback tout = new MyCallbackImpl(); 
    System.out.println(tout.toString()); 
    out.writeObject(tout); 

    MyObj obj = new MyObj("test", tout); 
    out.writeObject(obj); 
    System.out.println(obj.getCallback()); 
    out.close(); 
} 

Это конкретный класс MyCallbackImpl который был по частям на самом деле. Мы можем сказать с выхода:

[email protected] 
[email protected] 

Как и другие ответы упоминали, анонимные классы, локальные классы и нестатические внутренние классы не могут получить сериализации, в соответствии с подробным объяснением here

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