2016-08-08 79 views
0

Ich habe den folgenden Code:RMI: Sind Felder des Remote-Objekts serialisiert und an den Client gesendet?

public class Foo implements SomeRemote { 
    private String verySecretString; 
    public void doSomething(){...} 
} 

Wie ich foo verstehen irgendwie serialisiert und von RMI-Server RMI-Client gesendet werden. Kann der Client trotzdem auf verySecretString zugreifen?

+0

Serialisierung im Allgemeinen nicht eine tiefe Kopie macht - haben Sie getestet, um zu sehen, was gesendet wird? –

+1

@ DavidT.Macknet Serialisierung * tut * eine tiefe Kopie, immer, aber es gibt keine Serialisierung hier. – EJP

+0

Interessant, und nicht der Fall in anderen Sprachen, wo nur die öffentlichen Darstellungen serialisiert sind. Ich nehme an, dass es eine Serialisierung geben muss, um das auf den Draht zu schicken, aber hey, nicht meine Sprache, wirklich. –

Antwort

1

wie ich foo verstehen irgendwie serialisiert werden und von RMI-Server RMI clie gesendet nt.

Nein. Wenn Foo ein exportiertes Remote-Objekt ist, wird es nicht gesendet. Sein Stub wird gesendet.

Also, kann der Client trotzdem verySecretString zugreifen?

Nr

+0

Klingt wie keine tiefe Kopie, dann. ;) –

+0

@ DavidT.Macknet Es ist ein Proxy-Muster. Nichts mit tiefem oder oberflächlichem Kopieren oder Kopieren irgendwelcher Art zu tun. Und zwar von RMI, nicht von Serialisierung. – EJP

+0

Verstehe ich Sie richtig - der Client hat keinen Zugriff auf Instanz von 'Foo', Client wird Zugriff auf Stub, die' SomeRemote' Schnittstelle implementiert? –

2

Das ist nicht wie es funktioniert, Sie sollten eine Remote-Schnittstelle anstelle einer Klasse verfügbar machen und dann die Schnittstelle auf Client-Ebene so manipulieren, dass der Client keine Ahnung von den Implementierungsdetails hat.

hier Sie sollten also eher so etwas wie haben:

public interface MyService extends Remote { 
    void doSomething() throws RemoteException; 
} 

Dies ist nur das, was Sie auf Client-Ebene kennen. Auf der Sever-Ebene haben Sie Ihre Implementierung Foo, so etwas wie:

public class Foo implements MyService { 
    private String verySecretString; 
    public void doSomething(){...} 
} 

Antwort Update:

Wenn Sie nicht möchten, dass ein Feldwert serialisiert werden einfach das Stichwort hinzufügen transient auf seine Erklärung als nächstes:

private transient String verySecretString;