2017-02-21 2 views
0

Ich entwickle derzeit eine Webanwendung und möchte Java-Objekte persistent auf dem Server machen, so dass sie jederzeit abgerufen werden können. Da eine Datenbank für meine Anwendung ein Overkill ist, wähle ich die einfachste Möglichkeit, Java-Objekte zu erhalten: Serialisierung nach xml oder nach Bytes. Leider ist ein großer Teil des Codes, den ich verwende, Java-Klassen, die ich nicht modifizieren kann, und diese Klassen implementieren die Schnittstelle 'serialisierbar' nicht. Welche Optionen habe ich, um Objekte dieser Klassen sowie andere interagierende Objekte meiner eigenen Klassen zu serialisieren?Java-Serialisierung von nicht serialisierbaren Drittanbieter-Klasse

+1

Wenn Sie sie ableiten und Serializable in der untergeordneten Klasse implementieren können, sind Sie bereit zu gehen. Die andere Möglichkeit besteht darin, eine benutzerdefinierte Methode zu implementieren, um sie selbst zu serialisieren. Ihre Frage ist ein bisschen zu weit gefasst, um hier beantwortet zu werden. Aber als kleines Beispiel: Ein Pfad könnte als String serialisiert werden, wenn er immer vom selben Rechner deserialisiert wird. Bitte beachten Sie auch, dass Klassen wie java.io.Stream einfach nicht serialisiert werden können. Sie müssen einen Weg finden, wie Ihr Code einen Stream von etwas anderem neu erstellen kann. –

+0

Ich denke, die Lösung in meinem Fall besteht darin, eine benutzerdefinierte Methode zur Serialisierung des Objekts zu implementieren, indem ich eine eigene Implementierung der writeObject- und readObject-Methoden der Serializable-Schnittstelle zur Verfügung stelle. Wie würden Sie vorschlagen, die ursprüngliche Drittanbieterklasse zu verpacken? Indem Sie diese Klasse erweitern oder eine neue Klasse anlegen, die auf ein Objekt der Third-Party-Klasse verweist? –

+0

Ich würde für eine Schnittstelle 'Serializer ' gehen, die zwei Methoden darstellen würde: a 'Serializable toSerializable (T objectToSerialize)' und ein 'T fromSerializable (Serializable serializedObject)' mit eindeutigen Serialisierbaren Klassen für jede Klasse, die Sie serialisieren müssen.Dann wickeln Sie Ihren gesamten Serializer in einen Serialisierungsdienst/Factory ein, der den Weg von und nach finden kann. Daher haben Sie nur eine Zwischenschicht (DAO) zwischen Ihren unserialisierbaren Klassen und Ihren serialisierten Dateien. –

Antwort

1

Wie ich in meinen Kommentaren sagte, würde ich für eine SerializationService gehen, die die richtige Serializer<T> für jedes Objekt finden würde, die Sie speichern möchten.

Etwas wie:

public interface Serializer<T> { 

Serializable toSerializable(T objectToSerialize); 

//to build a factory/service around it 
boolean canDeserialize(Serializable serializedObject); 

T fromSerializable(Serializable serializedObject); 

}

Und wenn Sie ein einfaches, konkretes Beispiel: mit dem ziemlich gemeinsamen Pfad:

public class PathSerializer implements Serializer<Path> { 

@Override 
public Serializable toSerializable(Path objectToSerialize) { 
    return objectToSerialize.toString(); 
} 

@Override 
public Path fromSerializable(Serializable serializedObject) { 
    if(!canDeserialize(serializedObject)){ 
     throw new IllegalArgumentException("Cannot deserialize this"); 
    } 
    return Paths.get((String)serializedObject); 
} 

@Override 
public boolean canDeserialize(Serializable serializedObject) { 
    return serializedObject != null && serializedObject instanceof String; 
} 

}

Sie könnten Speichern Sie auch sehr gut POJO mit dem Namen Ihrer ursprünglichen Objektklasse und der Liste der Parameter Sie benötigen in ihrem Konstruktor und/oder eine Karte ihrer Felder, um Ihre Objekte durch Reflexion regenerieren zu können.

Es liegt an Ihnen und der Komplexität Ihrer Anwendung.

0

Ich denke, JSON wäre hier die richtige Lösung. Nehmen Sie zum Beispiel Googles GSON Bibliothek. Sie brauchen nicht Ihre Klassen mit Anmerkungen versehen, einfach

Gson gson = new Gson(); 
MyObj obj = gson.fromJson(jsonString); 
String json = gson.toJson(obj); 

Weitere allgemeine Informationen über das JSON-Format schreiben die official JSON documentation sehen.

0

Eine Option wäre, die Klassen zu erweitern, auf die Sie keinen Zugriff haben, um ihren internen Status zu speichern und Serializable auf diesen zu implementieren.

Mehr Informationen zu dieser Frage SO: Serializing a class variable which does not implement serializable

Außerdem, ich glaube nicht, dass es eine andere Option ist es, einige Wrapper außer den Aufbau und die Klassen manuell zu XML oder JSON Serialisierung.

+0

Könnten Sie mir ein Code-Beispiel für eine Wrapper-Klasse geben diese manuelle Serizalisierung? Vielen Dank! –

Verwandte Themen