2016-07-29 20 views
0

Ich versuche eine Klasse zu erstellen, die einen Programmstapel modelliert. Ist es möglich, diese Klasse serializable zu machen? Ich möchte in der Lage sein, dies als Akka Nachrichten zu verwenden. Vielen Dank!Java-Funktionen in Java serialisieren 8

public class ProgramStack<T>{ 

    public final Queue<UnaryOperator<T>> programStack; 
    private T context; 

    ProgramStack(Queue<UnaryOperator<T>> programStack, T context) { 
     this.programStack = programStack; 
     this.context = context; 
    } 

    public void next() { 
     UnaryOperator function = programStack.poll(); 
     function.apply(context); 
    } 

    public boolean hasNext() { 
     return !programStack.isEmpty(); 
    } 

} 
+1

Sie müssen die Schnittstelle Serializable implementieren. Sie können hier sehen https://docs.oracle.com/javase/8/docs/technotes/guides/serialization/ –

+0

Dank @AshwaniTiwari Ich bin mir nicht sicher, wie UnaryOperator serialisierbar machen. – dwong

+0

Gibt es eine innere Klasse in der UniaryOperator Klasse? Wenn nicht, haben Sie einfach UniaryOperator implementiert Serializable –

Antwort

1

Für ein Sie Serialisierung nicht Methoden Sie Objekte serialisiert werden, die Verhaltensweisen haben. Um dies serialisieren zu können, müssen Sie Serializable implementieren. Alle Mitglieder müssen dies tun. Wenn Sie auf das Dokument schauen https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html Warteschlange implementiert nicht Serializable, also stellen Sie sicher, was Objekt implementiert Queue ist serialisierbar. Ich weiß nicht, was T ist, aber das muss auch Serializable implementieren, um Ihr Objekt vom Typ ProgramStack zu serialisieren.

+0

Dank @Javant! Ich denke, das Problem ist UnaryOperator ist nicht serialisierbar. – dwong

+2

Ein 'UnaryOperator' ist eine Schnittstelle. So ist eine 'Warteschlange'. Es kommt nur darauf an, dass das konkrete Objekt auf irgendeiner Ebene 'Serializable' implementiert. (Bsp. 'LinkedList' ist' Serializable' und implementiert 'Queue') Die doppelte Antwort zeigt, wie eine Lambda/Funktionsreferenz serialisiert wird. – 4castle

+0

@dwong Alles, was Sie tun müssen, ist '' deklariert T serializable> 'in Ihrer Klassendeklaration, und stellen Sie dann sicher, dass alle Objekte, die der' Queue' Struktur hinzugefügt werden, durch Umwandlung in '(UnaryOperator & Serializable)' deklariert werden – 4castle

-4
import java.io.Serializable; 

public class ProgramStack<T> implements Serializable { 

// etc etc 

}