So serialisieren Sie in Java
1. Serialisierung und Deserialisierung
Serialisierung: Bezieht sich auf die Java-Objektdaten im Heap-Speicher auf irgendeine Weise in einer Festplattendatei koppeln oder an andere Netzwerkknoten weitergeben (Netzwerkübertragung). Dieser Vorgang wird Serialisierung genannt und bezieht sich normalerweise auf den Vorgang der Konvertierung einer Datenstruktur oder eines Objekts in eine Binärdatei.
即将对象转化为二进制,用于保存,或者网络传输。
Deserialisierung: Der Prozess der Wiederherstellung der Objektdaten in der Festplattendatei oder der Objektdaten auf dem Netzwerkknoten im Java-Objektmodell. Das heißt, der Prozess der Konvertierung der während des Serialisierungsprozesses generierten Binärzeichenfolge in eine Datenstruktur oder ein Objekt
与序列化相反,将二进制转化成对象。
2 Die Rolle der Serialisierung
① Möchten Sie speichern? Speicher Wenn die Objekte in einer Datei oder Datenbank gespeichert werden;
② Wenn Sie Sockets zum Übertragen von Objekten über das Netzwerk verwenden möchten
③ Wenn Sie Objekte über RMI übertragen möchten; >
一些应用场景,涉及到将对象转化成二进制,序列化保证了能够成功读取到保存的对象。
3. Java-Serialisierungsimplementierung
Um die Serialisierung von Objekten zu realisieren, besteht die direkteste Operation darin, die serialisierbare Schnittstelle zu implementierenVerwenden Sie Objekte im IO Stream Streams können Serialisierungsvorgänge implementieren, Objekte in Dateien speichern und sie dann auslesen. Erstellen Sie zunächst ein Objekt und implementieren Sie die serialisierbare Schnittstelle:import java.io.Serializable; public class User implements Serializable{ private static final long serialVersionUID = 1L; private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } }Verwenden Sie den Objektstrom, um eine Toolklasse zum Speichern und Lesen von Objekten zu schreiben:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class SerializeUtil { // 保存对象,序列化 public static void saveObject(Object object) throws Exception { ObjectOutputStream out = null; FileOutputStream fout = null; try { fout = new FileOutputStream("D:/1.txt"); out = new ObjectOutputStream(fout); out.writeObject(object); } finally { fout.close(); out.close(); } } // 读取对象,反序列化 public static Object readObject() throws Exception { ObjectInputStream in = null; FileInputStream fin = null; try { fin = new FileInputStream("D:/1.txt"); in = new ObjectInputStream(fin); Object object = in.readObject(); return object; } finally { fin.close(); in.close(); } } }Test:
public class Main { public static void main(String[] args) { User user = new User(); user.setName("旭旭宝宝"); user.setAge(33); // 保存 try { SerializeUtil.saveObject(user); } catch (Exception e) { System.out.println("保存时异常:" + e.getMessage()); } // 读取 User userObject; try { userObject = (User) SerializeUtil.readObject(); System.out.println(userObject); } catch (Exception e) { System.out.println("读取时异常:" + e.getMessage()); } } }Testergebnisse:
public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } }und testen dann die Main-Methode:
4. Die Rolle der Serialisierungs-ID
Wie Sie sehen können, fügen wir beim Serialisieren ein serialVersionUID-Feld hinzu, das die Serialisierungs-ID istprivate static final long serialVersionUID = 1L;Diese Serialisierungs-ID spielt eine Schlüsselrolle, sie bestimmt, ob die Deserialisierung erfolgreich sein kann! Der Serialisierungsmechanismus von Java überprüft die Versionskonsistenz, indem er die serialVersionUID der Laufzeitklasse beurteilt. Während der Deserialisierung vergleicht die JVM die serialVersionUID im eingehenden Bytestrom mit der serialVersionUID in der lokalen Entitätsklasse Andernfalls wird eine Ausnahme inkonsistenter serialisierter Versionen gemeldet.
即序列化ID是为了保证成功进行反序列化
5. Standard-Serialisierungs-ID
Wenn wir in einer unserer Entitätsklassen nicht explizit eine Variable mit dem Namen „serialVersionUID“ vom Typ long definieren, wird der Java-Serialisierungsmechanismus verwendet generiert automatisch eine serialVersionUID basierend auf der kompilierten Klasse als Serialisierungsversionsvergleich. In diesem Fall generieren nur die durch dieselbe Kompilierung generierten Klassen dieselbe serialVersionUID. Wenn wir beispielsweise eine Klasse schreiben, müssen wir im Laufe der Zeit aufgrund geänderter Anforderungen weitere Felder zur lokalen Klasse hinzufügen. Zu diesem Zeitpunkt ist die SerialVersionUID während der Deserialisierung inkonsistent, was dazu führt, dass die Deserialisierung fehlschlägt. Wie kann man es also lösen? Fügen Sie einfach eine Variable „serialVersionUID“ zur lokalen Klasse hinzu, der Wert bleibt unverändert und Serialisierung und Deserialisierung können durchgeführt werden.如果没有显示指定serialVersionUID,会自动生成一个。 只有同一次编译生成的class才会生成相同的serialVersionUID。 但是如果出现需求变动,Bean类发生改变,则会导致反序列化失败。为了不出现这类的问题,所以我们最好还是显式的指定一个 serialVersionUID。
6. Andere Probleme mit der Serialisierung
1 Statische Variablen werden nicht serialisiert (statisch, vorübergehend) Wenn ein Das übergeordnete Element Die Klasse implementiert die Serialisierung und die Unterklasse implementiert die Serialisierung automatisch. Es ist nicht erforderlich, die Serializable-Schnittstelle explizit zu implementieren. 3. Wenn die Instanzvariablen eines Objekts auf andere Objekte verweisen, wird bei der Serialisierung des Objekts auch das referenzierte Objekt serialisiert.子类序列化时: 如果父类没有实现Serializable接口,没有提供默认构造函数,那么子类的序列化会出错; 如果父类没有实现Serializable接口,提供了默认的构造函数,那么子类可以序列化,父类的成员变量不会被序列化。如果父类 实现了Serializable接口,则父类和子类都可以序列化。
7. Verwenden Sie ein effizienteres Serialisierungsframework – Protostuff
<dependency> <groupId>io.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.5.9</version> </dependency>
<dependency> <groupId>io.protostuff</groupId> <artifactId>protostuff-core</artifactId> <version>1.5.9</version> </dependency>Ändern Sie den Hauptcode
import com.dyuproject.protostuff.LinkedBuffer; import com.dyuproject.protostuff.ProtobufIOUtil; import com.dyuproject.protostuff.ProtostuffIOUtil; import com.dyuproject.protostuff.Schema; import com.dyuproject.protostuff.runtime.RuntimeSchema; public class Main { public static void main(String[] args) { User user = new User(); user.setName("旭旭宝宝"); user.setAge(33); Schema<User> schema = RuntimeSchema.getSchema(User.class); // 保存对象,序列化,转化二进制数据 LinkedBuffer buffer = LinkedBuffer.allocate(512); final byte[] protostuff; try { protostuff = ProtobufIOUtil.toByteArray(user, schema, buffer); } finally { buffer.clear(); } // 读取对象,反序列化 User userObject = schema.newMessage(); ProtostuffIOUtil.mergeFrom(protostuff, userObject, schema); System.out.println(userObject); } }Benutzerklasse implementiert die serialisierbare Schnittstelle nicht
public class User { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } }Testergebnisse:
若要要整合Redis使用,也可以写成一个工具类:
import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.dyuproject.protostuff.LinkedBuffer; import com.dyuproject.protostuff.ProtobufIOUtil; import com.dyuproject.protostuff.Schema; import com.dyuproject.protostuff.runtime.RuntimeSchema; public class SerializeUtil { private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<>(); @SuppressWarnings("unchecked") public static <T> byte[] serializer(T obj) { Class<T> clazz = (Class<T>) obj.getClass(); Schema<T> schema = getSchema(clazz); return ProtobufIOUtil.toByteArray(obj, schema, LinkedBuffer.allocate(256)); } public static <T> T deSerializer(byte[] bytes, Class<T> clazz) { T message; try { message = clazz.newInstance(); } catch (InstantiationException | IllegalAccessException e) { throw new RuntimeException(e); } Schema<T> schema = getSchema(clazz); ProtobufIOUtil.mergeFrom(bytes, message, schema); return message; } @SuppressWarnings("unchecked") public static <T> Schema<T> getSchema(Class<T> clazz) { Schema<T> schema = (Schema<T>) cachedSchema.get(clazz); if (schema == null) { schema = RuntimeSchema.createFrom(clazz); if (schema != null) { cachedSchema.put(clazz, schema); } } return schema; } }
这样即使我们的User类就不用再实现Serialiable接口了,同样可以进行序列化,效率也更高。
php中文网,大量的免费Java入门教程,欢迎在线学习!
Das obige ist der detaillierte Inhalt vonSo serialisieren Sie in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Pre-Formancetartuptimemoryusage, QuarkusandmicronautleadduToCompile-Time-foringandgraalvSupport, WithQuarkusofttenperformLightBetterin serverloser Szenarien.2. Thyvelopecosystem,

Zunächst checkifthefnkeysettingIssinterferingbyingbothThevolumeKeyaloneAndfn VolumeKey, thentogglefnlockwithfn EscifAvailable

Verwenden Sie die Methode .equals (), um den String -Inhalt zu vergleichen, da == nur Objektreferenzen als Inhalt vergleichen; 1. Verwenden Sie .Equals (), um die Zeichenfolgenwerte gleichermaßen zu vergleichen; 2. Verwenden Sie .EqualSignoreCase (), um das Ignorieren zu vergleichen; 3. verwenden. Compareto (), um Zeichenfolgen in der Wörterbuchreihenfolge zu vergleichen, wobei 0, negative oder positive Zahlen zurückgegeben werden; V. 5. Objekte verwenden. Ausgleich () oder Safe Call -Methode, um Null -Zeichenfolgen zu verarbeiten, um Null -Zeiger -Ausnahmen zu vermeiden. Kurz gesagt, Sie sollten vermeiden, == für String -Inhaltsvergleiche zu verwenden, es sei denn, es ist ausdrücklich erforderlich, zu überprüfen, ob sich das Objekt in der Phase befindet.

Die Verwendung von String.Join () (Java8) ist die am einfachsten empfohlene Methode zum Anschließen von String -Arrays. Geben Sie einfach den Trennzeichen direkt an. 2. Für alte Versionen von Java oder wenn mehr Kontrolle benötigt wird, können Sie StringBuilder verwenden, um manuell zu durchqueren und zu spleißen. 3.. Stringjoiner eignet sich für Szenarien, die flexiblere Formate wie Präfixe und Suffixe erfordern. V. Zusammenfassend sollte die Methode String.Join () in den meisten Fällen bevorzugt werden, wenn Java8 und höher verwendet wird.

Das Protokollierungsmodul von Python kann Protokolle über FileHandler in Dateien schreiben. Rufen Sie zunächst den Prozessor und das Format der BasicConfig -Konfigurationsdatei auf, z. Zweitens fügen Sie StreamHandler hinzu, um gleichzeitig die Ausgabe an die Konsole zu erreichen. Fortgeschrittene Szenarien können TimedrotatingFileHandler verwenden, um Protokolle nach Zeit zu teilen, z. B. Einstellung, wann = 'Mitternacht' jeden Tag neue Dateien generiert und 7 Tage Backup beibehalten, und sicherzustellen, dass das Protokollverzeichnis existiert. Es wird empfohlen, GetLogger (__ Name__) zu verwenden, um benannte Logger zu erstellen und zu produzieren

Die Verwendung von Pandastyling in Jupyternotebook kann die schöne Anzeige von DataFrame erreichen. 1. Verwenden Sie Highlight_max und highlight_min, um den Maximalwert (grün) und den minimalen Wert (rot) jeder Spalte hervorzuheben. 2. Fügen Sie die Farbgradient -Hintergrundfarbe (wie Blau oder Rot) zur numerischen Spalte über Hintergrund_gradient hinzu, um die Datengröße visuell anzuzeigen. 3.. Benutzerdefinierte Funktion color_score kombiniert mit ApplyMap zum Festlegen von Textfarben für verschiedene Bruchintervalle (≥90 Grün, 80 ~ 89 Orange, 60 ~ 79 rot,

Berechnet hat einen Cache, und mehrere Zugriffe werden nicht neu berechnet, wenn die Abhängigkeit unverändert bleibt, während Methoden jedes Mal ausgeführt werden, wenn sie aufgerufen werden. 2. Computed eignet sich für Berechnungen basierend auf reaktionsschnellen Daten. Methoden eignen sich für Szenarien, in denen Parameter erforderlich sind, oder häufige Aufrufe, das Ergebnis hängt jedoch nicht von reaktionsschnellen Daten ab. 3. Computed unterstützt Getter und Setzer, die die Zwei-Wege-Synchronisation von Daten realisieren können. Methoden werden jedoch nicht unterstützt. 4. Zusammenfassung: Verwenden Sie zuerst berechnet, um die Leistung zu verbessern und Methoden zu verwenden, wenn sie Parameter übergeben, Vorgänge ausführen oder Cache vermeiden. Nach dem Prinzip "Wenn Sie berechnet können, verwenden Sie keine Methoden".

Die erweiterten Bedingungstypen von TypeScript implementieren logische Beurteilung zwischen den Typen über textendu? X: y syntax. Die Kernfähigkeiten spiegeln sich in den verteilten Bedingungstypen, den Abschluss -Inferenz und der Konstruktion komplexer Typ -Werkzeuge wider. 1. Der bedingte Typ ist in den Parametern mit nötigen Typen verteilt und kann den Gelenktyp automatisch aufteilen, z. 2.. Verwenden Sie die Verteilung, um Filter- und Extraktionsinstrumente zu erstellen: Ausschließen Typen über Textendsu? Nie: t, extrahieren Gemeinsamkeiten durch textendu? 3
