<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 使用`readObject`和`writeObject`的 Java 自定義序列化 > 原文: [https://howtodoinjava.com/java/serialization/custom-serialization-readobject-writeobject/](https://howtodoinjava.com/java/serialization/custom-serialization-readobject-writeobject/) 在某些情況下,您可能需要在 Java 中使用**自定義序列化**。 例如,您有遺留的 Java 類,由于任何原因都不愿意對其進行修改。 也可能存在一些設計約束。 甚至簡單地說,該類將在將來的發行版中進行更改,這可能會破壞[先前序列化對象的反序列化](https://howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/)。 ```java Table of Contents 1\. Custom Serialization 2\. Default Serialization with Added Validation 3\. Summary ``` ## 1\. Java 自定義序列化 在大多數情況下,當**自定義 Java 序列化**時,您將按順序逐一寫入字段。 它最常用的*方法將覆蓋默認的 Java 序列化*進程。 假設我們有一個`User`對象,我們想自定義它的序列化過程。 ```java public class User implements Serializable { private static final long serialVersionUID = 7829136421241571165L; private String firstName; private String lastName; private int accountNumber; private Date dateOpened; public User(String firstName, String lastName, int accountNumber, Date dateOpened) { super(); this.firstName = firstName; this.lastName = lastName; this.accountNumber = accountNumber; this.dateOpened = dateOpened; } public User() { super(); } public final String getFirstName() { return firstName; } public final String getLastName() { return lastName; } public final int getAccountNumber() { return accountNumber; } public final Date getDateOpened() { return new Date(dateOpened.getTime()); } public final void setFirstName(String aNewFirstName) { firstName = aNewFirstName; } public final void setLastName(String aNewLastName) { lastName = aNewLastName; } public final void setAccountNumber(int aNewAccountNumber) { accountNumber = aNewAccountNumber; } public final void setDateOpened(Date aNewDate) { Date newDate = new Date(aNewDate.getTime()); dateOpened = newDate; } } ``` #### 1.1 `readObject()`和`writeObject()`方法 要自定義序列化和反序列化,請在此類中定義`readObject()`和`writeObject()`方法。 * 在`writeObject()`方法內部,使用`ObjectOutputStream`提供的`writeXXX`方法編寫類屬性。 * 在`readObject()`方法內部,使用`ObjectInputStream`提供的`readXXX`方法讀取類屬性。 * 請注意,讀寫方法中類屬性的**序列必須與**相同。 ```java import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Date; public class User implements Serializable { private static final long serialVersionUID = 7829136421241571165L; private String firstName; private String lastName; private int accountNumber; private Date dateOpened; public User(String firstName, String lastName, int accountNumber, Date dateOpened) { super(); this.firstName = firstName; this.lastName = lastName; this.accountNumber = accountNumber; this.dateOpened = dateOpened; } public User() { super(); } //Setters and Getters private void readObject(ObjectInputStream aInputStream) throws ClassNotFoundException, IOException { firstName = aInputStream.readUTF(); lastName = aInputStream.readUTF(); accountNumber = aInputStream.readInt(); dateOpened = new Date(aInputStream.readLong()); } private void writeObject(ObjectOutputStream aOutputStream) throws IOException { aOutputStream.writeUTF(firstName); aOutputStream.writeUTF(lastName); aOutputStream.writeInt(accountNumber); aOutputStream.writeLong(dateOpened.getTime()); } } ``` 現在,我們來測試代碼。 #### 1.2 測試自定義序列化 ```java package com.howtodoinjava.io.example; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Calendar; import java.util.Date; public class TestCustomSerialization { public static void main(String[] args) { // Create new User object User myDetails = new User("Lokesh", "Gupta", 102825, new Date(Calendar.getInstance().getTimeInMillis())); // Serialization code try { FileOutputStream fileOut = new FileOutputStream("User.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(myDetails); out.close(); fileOut.close(); } catch (IOException i) { i.printStackTrace(); } // De-serialization code User deserializedUser = null; try { FileInputStream fileIn = new FileInputStream("User.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); deserializedUser = (User) in.readObject(); in.close(); fileIn.close(); // verify the object state System.out.println(deserializedUser.getFirstName()); System.out.println(deserializedUser.getLastName()); System.out.println(deserializedUser.getAccountNumber()); System.out.println(deserializedUser.getDateOpened()); } catch (IOException ioe) { ioe.printStackTrace(); } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } } } ``` //輸出 ```java Lokesh Gupta 102825 Wed May 24 13:05:25 IST 2017 ``` ## 2\. 覆蓋默認序列化以添加驗證 有時,您可能只需要執行任何特定的驗證,或者在反序列化的對象上運行一些業務規則,而不會影響默認的 Java 序列化機制。 當您決定使用`readObject()`和`writeObject()`方法時,這也是可能的。 在此用例中,可以在`readObject()`和`writeObject()`方法中使用`defaultReadObject()`和`defaultWriteObject()` - 啟用默認的序列化和反序列化。 然后,您可以將您的*自定義驗證*或業務規則插入讀/寫方法中。 這樣,在默認的序列化和反序列化過程發生后,JVM 將立即自動調用驗證方法。 ```java public class User implements Serializable { //class attributes, constructors, setters and getters as shown above /** * Always treat de-serialization as a full-blown constructor, by validating the final state of the de-serialized object. */ private void readObject(ObjectInputStream aInputStream) throws ClassNotFoundException, IOException { // perform the default de-serialization first aInputStream.defaultReadObject(); // make defensive copy of the mutable Date field dateOpened = new Date(dateOpened.getTime()); // ensure that object state has not been corrupted or tampered with malicious code //validateUserInfo(); } /** * This is the default implementation of writeObject. Customize as necessary. */ private void writeObject(ObjectOutputStream aOutputStream) throws IOException { //ensure that object is in desired state. Possibly run any business rules if applicable. //checkUserInfo(); // perform the default serialization for all non-transient, non-static fields aOutputStream.defaultWriteObject(); } } ``` 再次測試代碼,您將看到以下輸出: ```java Lokesh Gupta 102825 Wed May 24 13:10:18 IST 2017 ``` ## 3\. 總結 如我們所見,自定義序列化在 Java 中非常容易,并且涉及非常簡單的設計,即實現`readObject()`和`writeObject()`方法; 并添加任何其他邏輯以支持應用程序業務邏輯。 盡管在大多數情況下,默認的序列化/反序列化就足夠了; 在需要時仍應在 Java 應用程序中使用自定義序列化。 將我的問題放在評論部分。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看