Genau wie der Titel sagt, gibt es eine Möglichkeit zu überprüfen, ob ein Objekt serialisierbar ist, und wenn nicht, machen Sie es zur Laufzeit?Können Sie ein Objekt zur Laufzeit serialisierbar machen?
Antwort
Kurze Antwort - Nr.
Längere Antwort - ja, mit Byte-Code-Manipulation, zum Beispiel mit Asm. Aber du solltest wirklich darüber nachdenken, ob das nötig ist. Serialisierung ist eine ernste Angelegenheit (Effective Java hat ein ganzes Kapitel über die Serialisierung)
BTW, gibt es Alternativen zu binärer Serialisierung, die Serializble
nicht das Objekt erfordert Implementierung (wie von Jacob in den Kommentaren darauf):
- XML -
java.beans.XMLEncoder.encode(..)
ist die XML-Version vonObjectOutputStream
- JSON - Frameworks wie Jacson, Gson können Sie ein Objekt mit einer Zeile serialisieren.
+1 für die Aufnahme entsprechender Warnungen. – DJClayworth
Wie andere gesagt haben ... kurze Antwort ist Nein.
Sie können absolut eine Schnittstelle zu jedem alten Objekt zur Laufzeit Objekte unter Verwendung von Proxy hinzufügen, wie bei http://download.oracle.com/javase/6/docs/technotes/guides/reflection/proxy.html beschrieben. Dies beinhaltet auch java.io.Serializable. Damit ein Proxy-Objekt jedoch nützlich ist, muss es einen internen Verweis auf das ursprüngliche Objekt beibehalten, das in Ihrem Fall kein Serializable implementiert. Die einzige Möglichkeit, Ihr Proxy-Objekt serialisieren zu können, besteht darin, die interne Referenz auf das ursprüngliche Objekt zu einem transienten Feld zu machen, und das würde Ihnen nicht viel Gutes bringen.
Weiter, nach Prüfung Ihrer Kommentare, es sieht aus wie Java-Serialisierung ist definitiv nicht das, was Sie wollen, und Sie wollen wirklich nur in ein String-Format zu serialisieren. Andere haben verschiedene Lösungen vorgeschlagen, aber IMO, wenn Sie die geringste Menge an Aufwand wollen, gehen Sie mit XStream: http://x-stream.github.io/tutorial.html.
Proxies werden über die Schnittstelle erstellt, nicht über eine Klasse. – Bozho
@Bozho - dieser Teil ist in der Dokumentation beschrieben, die ich verlinkt habe. Es würde einige Änderungen in seiner Codebasis erfordern, wenn er Interface nicht bereits verwendet, um polymorph (sp?) Auf seine Objekte zu verweisen. – whaley
Sein ursprüngliches Objekt wäre ein Mitglied des InvocationHandler, der ebenfalls serialisiert wird, was fehlschlagen wird. – Bozho
Whoa. Warum sollte es zur Laufzeit überprüft werden? Ist es nicht einfacher, es zur Kompilierzeit zu sichern? Einen Code einfach so verwenden.
public void someMethod(Serializable serializable){
}
Oder Sie können es komplexer machen.
public interface SerializableInterface implements Serializable{
// bla-bla
}
public void someMethod(SerializableInterface serializable){
}
Neben bestehenden guten Antworten, ist eine andere Frage, ob Sie speziell für spezifische Rahmen Java Serializable benötigen oder brauchen nur in der Lage Objekte Serializer sein. Für Letzteres gibt es viele viel mehr Auswahlmöglichkeiten als JDK Standard eins; und für viele Anwendungsfälle sind Alternativen viel besser als JDK.
Wenn Sie JDK nicht unbedingt benötigen, ist die Verwendung von JSON oder XML-basierter Serialisierung oft eine gute Wahl.
Der Grund, warum ich die Serialisierung betrachte, ist für ein Projekt Ich möchte ein Objekt in einen String (durch ein Byte-Array) für die Speicherung und Übertragung konvertieren, wo es aufgrund externer Faktoren ein String sein muss. Ich habe einige Beispiele gesehen, wie man die Serialisierung in einen Byte-Stream umwandeln kann, um das Objekt am Ende als String zu erfassen, aber nichts darüber, was zu tun ist, wenn das Objekt nicht serialisierbar ist. Ich verstehe, dass bestimmte Objekte nicht serialisiert werden müssen, aber in diesem Fall liegt es im Ermessen des Entwicklers. –
Ok, dann willst du definitiv JDK Serializable nicht benutzen. Ich würde empfehlen, JSON-Serialisierung (wie Jackson, siehe http://wiki.fasterxml.com/JacksonInFiveMinutes) zu verwenden. Das Ergebnis ist lesbarer und weniger fragil. Das Hauptproblem mit Serializable ist, dass die Versionierung sehr schwierig ist, also ist es ein Anti-Pattern, um Ergebnisse zu erhalten (lesen Sie zum Beispiel Josh Blochs Erklärung). Es ist auch nicht lesbar (anders als xml oder json). Es ist nichts falsch daran, Dinge per se zu serialisieren, aber Serializable ist selten der richtige Weg. – StaxMan
Überprüfung zur Laufzeit? Sicher. "if (someObject instanceof Serializable) ...".
Sie möchten die Definition eines Objekts zur Laufzeit ändern? Es gibt sehr selten einen guten Grund, dies zu wollen. Vielleicht gibt es eine Möglichkeit, dies mit Nachdenken zu tun, aber ich hatte nie einen Grund, so etwas zu wollen. Was versuchst du zu erreichen?
Wenn jemand wirklich wirklich wirklich mit Bytecode in Runtime manipulieren muss.
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("mypackage.MyClass");
cc.addInterface(pool.get("java.io.Serializable"))
- 1. Können Sie ein Objekt aufrufbar machen?
- 2. Change Autowired Objekt zur Laufzeit
- 3. Ändern injizierten Objekt zur Laufzeit
- 4. Wie definiert man ein C# -Objekt zur Laufzeit?
- 5. Machen Sie ein Objekt falsy
- 6. Wie kann ich ein Feld in Java serialisierbar machen?
- 7. Anzahl der Referenzen auf ein Objekt zur Laufzeit erhalten
- 8. Erstellen Sie usercontrol zur Laufzeit
- 9. Kann festgestellt werden, ob ein Objekt zur Laufzeit verfügbar ist?
- 10. Können Sie den ConnectionString-Konfigurationswert zur Laufzeit ändern?
- 11. Machen Sie "Klasse" transient oder serialisierbar ABER die Klasse ist serialisierbar
- 12. Wie alle Symbole im Bibliotheksordner zur Laufzeit zur Laufzeit hinzugefügt werden können
- 13. LinqToSQL - Cast IQueryable Objekt zur Laufzeit?
- 14. Wie überprüft man, ob ein Objekt serialisierbar ist in C#
- 15. Änderung TopMost zur Laufzeit
- 16. Laden Sie ein Byte [] in ein Bild zur Laufzeit
- 17. Log4j auf Änderungen in der Konfiguration zur Laufzeit aufmerksam machen
- 18. JPA-Kaskadenoptionen zur Laufzeit
- 19. Verwenden Sie `EditorSceneManager.SaveScene` zur Laufzeit
- 20. Wie können verschiedene Eigenschaften eines Objekts zur Laufzeit eingestellt werden?
- 21. wie ein Makro-Definition zur Laufzeit
- 22. So ändern Sie die Ansicht zur Laufzeit
- 23. java.lang.ClassCastException zur Laufzeit oder Compiler-
- 24. WPF: Wie können Sie zur Laufzeit ein neues Menüelement zu einem Menü hinzufügen?
- 25. Apportieren Kontextkonfiguration zur Laufzeit
- 26. Wie mache ich ein Excel-ActiveX-Label transparent ... zur Laufzeit?
- 27. Deaktivieren Sie JComboBox-Elemente zur Laufzeit
- 28. Ein laufendes jar zur Laufzeit austauschen
- 29. So verwalten Sie mehrere pageIndicator zur Laufzeit
- 30. Programmatisch registrieren HttpModules zur Laufzeit
Wenn das Objekt nicht serialisierbar ist, könnte es für einen guten Grund: Mit Bibliothek Javassist kann dies geschieht zum Beispiel, macht es wenig Sinn Datenbankverbindung zu serialisieren. –
Würde ein Serialisierungsformat, das keine Java-Objekt-Serialisierung ist, funktionieren? Ich denke an eine Lösung, die Reflektion und JSON oder XML verwendet, um das Objekt zu serialisieren. Aus anderen Kommentaren klingt es wie Ihre Anforderung ist, das Objekt in einen String zu machen, und das würde dies erreichen. –
Diese Frage ist sehr weit gefasst, vor allem weil sie nicht alle Ihre Design-Einschränkungen erwähnt. (Z. B. dass Sie ein Zeichenfolgenserialisierungsformat benötigen.) – jpaugh