簡體   English   中英

如何判斷 object 是可序列化的還是不可序列化的?

[英]How can one tell if an object is serializable or not serializable?

假設我們想將一些列表存儲在另一個列表中。 我們根據用戶要求處理我們的列表。 有些列表已排序,有些則未排序。 為了對列表進行排序,我們使用排序算法。 現在,當用戶關閉程序時,排序的工作就會丟失。 我們想通過序列化來保存這項工作。 有些對象是可序列化的,有些則不是。

run:
Draft1 java.io.NotSerializableException: drafts.Drafts
..\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 6 seconds)
run:
Draft02 java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: drafts.Fiction
Draft01 java.io.NotSerializableException: drafts.Fiction
..\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)
run:
////////draft...
Original: drafts.Drafts@6d03e736
Original: 100
Original: 3
//////////draftD... 
Deserialize: drafts.Drafts@17a7cec2
Deserialize: 100
Deserialize: 0
3
Virtual space.
Functional programming
Object OP
/////////////List Des
S1: 4
S2a: [Virtual space.]
S2b: [1569099619496#1 Searching for an answer on the web is like searching a needle on a haystack. Probably there is an answer for everything. If there is non or we can't find one, then we can create one. The old saying was, if it is not broken don't fix it! The brand new one is, if it is not perfect keep on trying!]
//.....................................................................//
TS4a: 1569099166372#3 1234567890...
TS5: {0=[Virtual space.], 1=[1569099166091#1 Searching for an answer on the web is like searching a needle on a haystack. Probably there is an answer for everything. If there is non or we can't find one, then we can create one. The old saying was, if it is not broken don't fix it! The brand new one is, if it is not perfect keep on trying!], 2=[1569099166372#2 Some array types containing other array types might not deserialize correctly, as all elements of the child type will point to the same memory. This limitation may be addressed in the future.]}
TS6: [1569099166091#1 Searching for an answer on the web is like searching a needle on a haystack. Probably there is an answer for everything. If there is non or we can't find one, then we can create one. The old saying was, if it is not broken don't fix it! The brand new one is, if it is not perfect keep on trying!]
TS7: [Virtual space.]
TS8: Sat Sep 21 22:52:46 CAT 2019
BUILD SUCCESSFUL (total time: 1 second)

這里發生了什么事?

  • 我們從 class 草稿開始。
  • 我們將其更改為 class Drafts implements Serializable。
  • 我們想使用外部 class Fiction lastFiction。
  • 我們對 class Fiction 沒有任何控制權,我們無法對其進行序列化,或者在嘗試時它會給我們帶來錯誤。
  • 所以我們將其更改為私有瞬態小說 lastFiction。

如何判斷 object 是可序列化的還是不可序列化的? 不使用破壞性測試。

/*
 * Drafts.java
 */
package drafts;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 * @Drafts
 */
public class Drafts implements Serializable{
    private int id;
    private String title;
    private boolean hardCopy;
    private String author; 
    private String discription; 
    private int year;
    private List<String> unsortedList;
    private List<String> sortedList;
    private List<List<String>> myList;
    private List<Drafts> draftList;
    private List<Object> objList;
    private List<Fiction> fictionList;
    private Map<Integer, List<String>> recentFiles;
    private transient int last;
    private Drafts lastDrafts;
    //private Fiction lastFiction;
    private transient Fiction lastFiction;
    private boolean lastb;
    private Date timeb;

    public Drafts(int i, String tl, boolean hc, String au, String dis, int yr) {
        id = i;
        title = tl;
        hardCopy = hc;
        author = au; 
        discription = dis; 
        year = yr;
        unsortedList = new ArrayList<>();
        sortedList = new ArrayList<>();
        myList = new ArrayList<>();
        draftList = new ArrayList<>();
        recentFiles = new HashMap<>();
        objList = new ArrayList<>();
        fictionList = new ArrayList<>();
        last = 0;
        lastb = true;
        timeb = new Date();
        objList.add(id);
        objList.add(timeb);
        objList.add(author);
        objList.add(title);
    }

    public Drafts(){
        lastDrafts = newDrafts();
        objList = new ArrayList<>();
        fictionList = new ArrayList<>();
    }

    private Drafts newDrafts(){
        // deserialize the Drafts
        Drafts lastBooks = null;
        lastb = true;
        try {
            FileInputStream fi = new FileInputStream("tmp");
            ObjectInputStream si = new ObjectInputStream(fi);
            lastBooks = (Drafts) si.readObject();
        }catch (Exception e) {
            System.out.println("Draft02 "+e);
            lastb = false;
            //System.exit(1);
        }

        return lastBooks;
    }

    private void saveDrafts(Drafts book){
        // serialize the Drafts
        try {
            FileOutputStream fo = new FileOutputStream("tmp");
            ObjectOutputStream so = new ObjectOutputStream(fo);
            so.writeObject(book);
            so.flush();
        } catch (Exception e) {
            System.out.println("Draft01 "+e);
            System.exit(1);
        }
    }

    public void update(String d) {
        unsortedList.add(d);
        objList.add(d);
        sortBlist(d);
        recentFiles.put(last, myList.get(myList.size() - 1));
        last++;
    }

    private void saveFiction(Fiction lastf){
        lastFiction = lastf;
        //objList.add(lastFiction);
        //fictionList.add(lastf);
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //Draft02 java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: drafts.Fiction
        //Draft01 java.io.NotSerializableException: drafts.Fiction
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    }

    private void sortBlist(String d){
        //Sort and add to sorted.
        sortedList.add(d);
        myList.add(sortedList);
        objList.add(sortedList);
        sortedList = new ArrayList<>();
    }

    private int searchBlist(String xText, String yText, List<String> sList, int beg, int end){
        //Search x in sList and replace it with y.
        //boolean found = false;
        //int n = -1;
        return 0;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        long t0 = System.currentTimeMillis();
        // create a Drafts object
        Drafts Test = new Drafts();
        Drafts book = new Drafts(100, "Functional programming", true, "S.P", "Programming", 2016);
        Drafts book1 = new Drafts(200, "Object OP", true, "O.S", "Data Structures", 2017);
        Drafts book2 = new Drafts(300, "How to deserialize", true, "D.D", "Deserialization", 2018);
        Drafts bookD = null;
        //
        Fiction book3 = new Fiction(100, "Virtual space.", "R.P", 2000);
        book.saveFiction(book3);
        book.update(book.lastFiction.getTitle());
        //
        String bookN0 = t0+"#1 Searching for an answer on the web is like searching a "
                + "needle on a haystack. Probably there is an answer for "
                + "everything. If there is non or we can't find one, then "
                + "we can create one. The old saying was, if it is not broken "
                + "don't fix it! The brand new one is, if it is not perfect "
                + "keep on trying!";

        book.update(bookN0);
        book1.update(bookN0);
        book2.update(bookN0);
        t0 = System.currentTimeMillis();

        String bookN1 = t0+"#2 Some array types containing other array types might not "
                + "deserialize correctly, as all elements of the child type "
                + "will point to the same memory. This limitation may be "
                + "addressed in the future.";

        book.update(bookN1);
        book1.update(bookN1);
        t0 = System.currentTimeMillis();
        String bookN2 = t0+"#3 1234567890...";
        book2.update(bookN2);

        book.draftList.add(book);
        book.draftList.add(book1);
        book.draftList.add(book2);
        book.myList.add(book2.unsortedList);

        // serialize the Drafts
        book.saveDrafts(book);

        // deserialize the Drafts
        bookD = book.newDrafts();

        System.out.println();
        System.out.println("////////draft...");
        System.out.println("Original: "+book);
        System.out.println("Original: "+book.id);
        System.out.println("Original: "+book.last);
        System.out.println("//////////draftD... ");
        System.out.println("Deserialize: "+bookD);
        System.out.println("Deserialize: "+bookD.id);
        System.out.println("Deserialize: "+bookD.last);
        System.out.println(bookD.unsortedList.size());
        System.out.println(bookD.unsortedList.get(0));
        System.out.println(bookD.draftList.get(0).title);
        System.out.println(bookD.draftList.get(1).title);
        System.out.println("/////////////List Des");
        System.out.println("objList size: "+bookD.objList.size());
        System.out.println("objList: "+bookD.objList);
        System.out.println("S1: "+bookD.myList.size());
        System.out.println("S2a: "+bookD.myList.get(0));
        System.out.println("S2b: "+bookD.myList.get(1));
        System.out.println("S2c: "+bookD.myList.get(2));
        System.out.println("S2d: "+bookD.myList.get(3));
        System.out.println("S3: "+bookD.myList.get(0).get(0));
        System.out.println("S4: "+bookD.myList.get(1).get(0));
        System.out.println("S4a: "+bookD.myList.get(2).get(0));
        System.out.println("S4b: "+bookD.myList.get(3).get(0));
        System.out.println("S4c: "+bookD.myList.get(3).get(1));
        System.out.println("S4d: "+bookD.myList);
        System.out.println("S5: "+bookD.recentFiles.toString());
        System.out.println("S6: "+bookD.recentFiles.get(1));
        System.out.println("S7: "+bookD.recentFiles.get(0));
        System.out.println("S8: "+bookD.timeb);
        System.out.println("//////////TestD... ");
        if(Test.lastb){
            System.out.println("TS1: "+Test.lastDrafts.myList.size());
            System.out.println("TS2a: "+Test.lastDrafts.myList.get(0));
            System.out.println("TS2b: "+Test.lastDrafts.myList.get(1));
            System.out.println("TS2c: "+Test.lastDrafts.myList.get(2));
            System.out.println("TS3: "+Test.lastDrafts.myList.get(0).get(0));
            System.out.println("TS4: "+Test.lastDrafts.myList.get(1).get(0));
            System.out.println("TS4a: "+Test.lastDrafts.myList.get(3).get(1));
            System.out.println("TS5: "+Test.lastDrafts.recentFiles.toString());
            System.out.println("TS6: "+Test.lastDrafts.recentFiles.get(1));
            System.out.println("TS7: "+Test.lastDrafts.recentFiles.get(0));
            System.out.println("TS8: "+Test.lastDrafts.timeb);
        }
        else{
            System.out.println("//////////TestD... "+Test.lastb);
        }
        System.out.println();
    }   
}

很難找到嵌套類並查看它是否實現了可序列化。 解決此問題的更好方法是使用ObjectMapper ,它將您的 bean class 轉換為 json 文件,您可以將它們轉換回 Z93F725A07423FE1C889F448B33D21F4546B6666661CBDBD8B6661CBD

private void saveDrafts(Drafts book){
    // serialize the Drafts
    try {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.writeValue(new File("tmp/draft.json"), book);
    } catch (Exception e) {
        System.out.println("Draft01 "+e);
        System.exit(1);
    }
}

將 json 轉換為 object

private Drafts readDrafts(){
    // serialize the Drafts
    try {
        ObjectMapper objectMapper = new ObjectMapper();
        return objectMapper.readValue(new File("tmp/draft.json"), Drafts.class);
    } catch (Exception e) {
        System.out.println("Draft01 "+e);
        System.exit(1);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM