Как можно определить, сериализуем ли объект или нет? - PullRequest
0 голосов
/ 24 сентября 2019

Допустим, мы хотим сохранить некоторые списки в другом списке.Мы обрабатываем наш список в соответствии с требованиями пользователей.Некоторые списки отсортированы, некоторые нет.Для сортировки списка мы используем алгоритмы сортировки.Теперь, когда пользователь закрывает программу, отсортированная работа теряется.Мы хотим сохранить эту работу путем сериализации.Некоторые объекты сериализуемы, некоторые нет.

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)

Что здесь происходит?

  • Мы начали с класса Drafts.
  • Мы изменили его на класс Drafts, реализующий Serializable.
  • Мы хотим использовать внешний класс Fiction lastFiction.
  • Мы не имеем никакого контроля над классом Fiction, и мы можем 't сериализует его, или это дает нам ошибки, когда мы пытаемся.
  • Таким образом, мы изменили его на закрытый переходный Fiction lastFiction.

Как можно сказатьесли объект сериализуем или не сериализуем?Без использования разрушающего контроля.

/*
 * 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();
    }   
}

1 Ответ

2 голосов
/ 24 сентября 2019

Действительно трудно найти вложенные классы и посмотреть, реализует ли он сериализуемый класс.Лучшим способом решения этой проблемы было бы использование ObjectMapper, которое конвертировало бы ваш bean-класс в файл json, и вы можете преобразовать их обратно в объект java.

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 в объект

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);
    }
}
...