gpt4 book ai didi

java - 如何判断一个对象是否可序列化?

转载 作者:行者123 更新时间:2023-12-02 01:18:58 29 4
gpt4 key购买 nike

假设我们想要将一些列表存储在另一个列表中。我们根据用户的要求处理我们的列表。有些列表已排序,有些则未排序。为了对列表进行排序,我们使用排序算法。现在,当用户关闭程序时,排序的工作就会丢失。我们想通过序列化来保存这项工作。有些对象是可序列化的,有些则不是。

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 实现 Serialized。
  • 我们想要使用外部类 Fiction lastFiction。
  • 我们对 Fiction 类没有任何控制权,我们无法序列化它,或者当我们尝试序列化它时它会给我们带来错误。
  • 因此我们将其更改为 private Transient 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();
}
}

最佳答案

很难找到嵌套类并查看它是否实现了可序列化。解决此问题的更好方法是使用 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);
}
}

关于java - 如何判断一个对象是否可序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58070303/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com