国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Home Java Javagetting Started How to serialize in java

How to serialize in java

Nov 12, 2019 pm 05:44 PM
java Serialization

How to serialize in java

1. Serialization and Deserialization

Serialization: refers to the java object data in the heap memory. Store the pair in a disk file in some way, or pass it to other network nodes (network transmission). This process is called serialization, which usually refers to the process of converting a data structure or object into binary.

即將對(duì)象轉(zhuǎn)化為二進(jìn)制,用于保存,或者網(wǎng)絡(luò)傳輸。

Deserialization: The process of restoring the object data in the disk file or the object data on the network node to the Java object model. That is, the process of converting the binary string generated during the serialization process into a data structure or object

與序列化相反,將二進(jìn)制轉(zhuǎn)化成對(duì)象。

2. The role of serialization

① Want to store memory When the objects in are saved to a file or database;

② When you want to use sockets to transmit objects on the network;

③ When you want to transmit objects through RMI

一些應(yīng)用場(chǎng)景,涉及到將對(duì)象轉(zhuǎn)化成二進(jìn)制,序列化保證了能夠成功讀取到保存的對(duì)象。

3. Java serialization implementation

To achieve serialization of objects, the most direct operation is to implement the Serializable interface

Use objects in the IO stream Streams can implement serialization operations, save objects to files, and then read them out.

First create an object and implement the Serializable interface:

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 + "]";
    }
}

Use object stream to write a tool class for saving and reading objects:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializeUtil {
    // 保存對(duì)象,序列化
    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();
        }
    }
    // 讀取對(duì)象,反序列化
    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("保存時(shí)異常:" + e.getMessage());
        }
        // 讀取
        User userObject;
        try {
            userObject = (User) SerializeUtil.readObject();
            System.out.println(userObject);
        } catch (Exception e) {
            System.out.println("讀取時(shí)異常:" + e.getMessage());
        }
    }
}

Test results:

How to serialize in java

Here we successfully saved the object to a file and then read it out. If we do not implement the serialization interface at this time, an exception will occur. We cancel the implemented Serialiable interface code:

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 + "]";
    }
}

Test the Main method again:

How to serialize in java

You can see that an error is reported at this time, use e.printStackTrace( );View the details of the exception:

How to serialize in java

You can see the Unknown Source. Because it is not serialized, it cannot be saved and read.

4. The role of serialization ID

As you can see, when we serialize, we add a serialVersionUID field, which is the serialization ID

private static final long serialVersionUID = 1L;

This serialization ID plays a key role, it determines whether deserialization can be successful! Java's serialization mechanism verifies version consistency by judging the serialVersionUID of the runtime class. During deserialization, the JVM will compare the serialVersionUID in the incoming byte stream with the serialVersionUID in the local entity class. If If they are the same, they are considered consistent and can be deserialized. Otherwise, an exception of inconsistent serialized versions will be reported.

即序列化ID是為了保證成功進(jìn)行反序列化

5. Default serialization ID

When we do not explicitly define a variable named "serialVersionUID" and type long in an entity class , the Java serialization mechanism will automatically generate a serialVersionUID based on the compiled class as a serialization version comparison. In this case, only the classes generated by the same compilation will generate the same serialVersionUID. For example, when we write a class, as time goes by, we need to add other fields to the local class due to changes in requirements. At this time, serialVersionUID will be inconsistent during deserialization, causing deserialization to fail. So how to solve it? Just add a "serialVersionUID" variable to the local class, the value remains unchanged, and serialization and deserialization can be performed.

如果沒(méi)有顯示指定serialVersionUID,會(huì)自動(dòng)生成一個(gè)。
只有同一次編譯生成的class才會(huì)生成相同的serialVersionUID。
但是如果出現(xiàn)需求變動(dòng),Bean類發(fā)生改變,則會(huì)導(dǎo)致反序列化失敗。為了不出現(xiàn)這類的問(wèn)題,所以我們最好還是顯式的指定一個(gè)
serialVersionUID。

6. Other issues with serialization

1. Static variables will not be serialized (static, transient)

2. When a The parent class implements serialization, and the subclass automatically implements serialization. There is no need to explicitly implement the Serializable interface.

3. When the instance variables of an object refer to other objects, when the object is serialized, the referenced object is also serialized.

子類序列化時(shí):
如果父類沒(méi)有實(shí)現(xiàn)Serializable接口,沒(méi)有提供默認(rèn)構(gòu)造函數(shù),那么子類的序列化會(huì)出錯(cuò);
如果父類沒(méi)有實(shí)現(xiàn)Serializable接口,提供了默認(rèn)的構(gòu)造函數(shù),那么子類可以序列化,父類的成員變量不會(huì)被序列化。如果父類
實(shí)現(xiàn)了Serializable接口,則父類和子類都可以序列化。

7. Use a more efficient serialization framework—Protostuff

In fact, Java’s native serialization method (by implementing the Serialiable interface) is not as efficient as Not the highest.

There is a project on github to analyze serialization efficiency: https://github.com/eishay/jvm-serializers/wiki

How to serialize in java

Watch it The one with the best performance is colfer developed by Google, but because colfer is too difficult to use, most people use the protostuff serialization framework. To apply the framework, two libraries (core and runtime) need to be introduced.

①github address: https://github.com/protostuff/protostuff

③If you use Maven, add dependencies:

<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>

Modify Main code

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);
        // 保存對(duì)象,序列化,轉(zhuǎn)化二進(jìn)制數(shù)據(jù)
        LinkedBuffer buffer = LinkedBuffer.allocate(512);
        final byte[] protostuff;
        try {
            protostuff = ProtobufIOUtil.toByteArray(user, schema, buffer);
        } finally {
            buffer.clear();
        }
        // 讀取對(duì)象,反序列化
        User userObject = schema.newMessage();
        ProtostuffIOUtil.mergeFrom(protostuff, userObject, schema);
        System.out.println(userObject);
    }
}

User class does not implement the Serializable interface

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 + "]";
    }
}

Test results:

How to serialize in java

若要要整合Redis使用,也可以寫(xiě)成一個(gè)工具類:

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類就不用再實(shí)現(xiàn)Serialiable接口了,同樣可以進(jìn)行序列化,效率也更高。

php中文網(wǎng),大量的免費(fèi)Java入門教程,歡迎在線學(xué)習(xí)!

The above is the detailed content of How to serialize in java. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Applying Semantic Structure with article, section, and aside in HTML Applying Semantic Structure with article, section, and aside in HTML Jul 05, 2025 am 02:03 AM

The rational use of semantic tags in HTML can improve page structure clarity, accessibility and SEO effects. 1. Used for independent content blocks, such as blog posts or comments, it must be self-contained; 2. Used for classification related content, usually including titles, and is suitable for different modules of the page; 3. Used for auxiliary information related to the main content but not core, such as sidebar recommendations or author profiles. In actual development, labels should be combined and other, avoid excessive nesting, keep the structure simple, and verify the rationality of the structure through developer tools.

The requested operation requires elevation Windows The requested operation requires elevation Windows Jul 04, 2025 am 02:58 AM

When you encounter the prompt "This operation requires escalation of permissions", it means that you need administrator permissions to continue. Solutions include: 1. Right-click the "Run as Administrator" program or set the shortcut to always run as an administrator; 2. Check whether the current account is an administrator account, if not, switch or request administrator assistance; 3. Use administrator permissions to open a command prompt or PowerShell to execute relevant commands; 4. Bypass the restrictions by obtaining file ownership or modifying the registry when necessary, but such operations need to be cautious and fully understand the risks. Confirm permission identity and try the above methods usually solve the problem.

Differences Between Callable and Runnable in Java Differences Between Callable and Runnable in Java Jul 04, 2025 am 02:50 AM

There are three main differences between Callable and Runnable in Java. First, the callable method can return the result, suitable for tasks that need to return values, such as Callable; while the run() method of Runnable has no return value, suitable for tasks that do not need to return, such as logging. Second, Callable allows to throw checked exceptions to facilitate error transmission; while Runnable must handle exceptions internally. Third, Runnable can be directly passed to Thread or ExecutorService, while Callable can only be submitted to ExecutorService and returns the Future object to

Exploring Different Synchronization Mechanisms in Java Exploring Different Synchronization Mechanisms in Java Jul 04, 2025 am 02:53 AM

Javaprovidesmultiplesynchronizationtoolsforthreadsafety.1.synchronizedblocksensuremutualexclusionbylockingmethodsorspecificcodesections.2.ReentrantLockoffersadvancedcontrol,includingtryLockandfairnesspolicies.3.Conditionvariablesallowthreadstowaitfor

How Java ClassLoaders Work Internally How Java ClassLoaders Work Internally Jul 06, 2025 am 02:53 AM

Java's class loading mechanism is implemented through ClassLoader, and its core workflow is divided into three stages: loading, linking and initialization. During the loading phase, ClassLoader dynamically reads the bytecode of the class and creates Class objects; links include verifying the correctness of the class, allocating memory to static variables, and parsing symbol references; initialization performs static code blocks and static variable assignments. Class loading adopts the parent delegation model, and prioritizes the parent class loader to find classes, and try Bootstrap, Extension, and ApplicationClassLoader in turn to ensure that the core class library is safe and avoids duplicate loading. Developers can customize ClassLoader, such as URLClassL

Handling Common Java Exceptions Effectively Handling Common Java Exceptions Effectively Jul 05, 2025 am 02:35 AM

The key to Java exception handling is to distinguish between checked and unchecked exceptions and use try-catch, finally and logging reasonably. 1. Checked exceptions such as IOException need to be forced to handle, which is suitable for expected external problems; 2. Unchecked exceptions such as NullPointerException are usually caused by program logic errors and are runtime errors; 3. When catching exceptions, they should be specific and clear to avoid general capture of Exception; 4. It is recommended to use try-with-resources to automatically close resources to reduce manual cleaning of code; 5. In exception handling, detailed information should be recorded in combination with log frameworks to facilitate later

Asynchronous Programming Techniques in Modern Java Asynchronous Programming Techniques in Modern Java Jul 07, 2025 am 02:24 AM

Java supports asynchronous programming including the use of CompletableFuture, responsive streams (such as ProjectReactor), and virtual threads in Java19. 1.CompletableFuture improves code readability and maintenance through chain calls, and supports task orchestration and exception handling; 2. ProjectReactor provides Mono and Flux types to implement responsive programming, with backpressure mechanism and rich operators; 3. Virtual threads reduce concurrency costs, are suitable for I/O-intensive tasks, and are lighter and easier to expand than traditional platform threads. Each method has applicable scenarios, and appropriate tools should be selected according to your needs and mixed models should be avoided to maintain simplicity

What is the purpose of the `static` keyword in Java? What is the purpose of the `static` keyword in Java? Jul 05, 2025 am 02:36 AM

Static keywords are used in Java to create variables and methods that belong to the class itself, rather than instances of the class. 1. Static variables are shared by instances of all classes and are suitable for storing data shared by all objects, such as schoolName in the Student class. 2. Static methods belong to classes and do not depend on objects. They are often used in tool functions, such as Math.sqrt(), and can only access other static members. 3. Static code blocks are used to perform initialization operations when class loading, such as loading libraries or setting logs. 4. Static inner classes can be instantiated independently of the external class, but non-static members of the external class cannot be accessed. Rational use of static can effectively manage class-level resources and behaviors.

See all articles