【发布时间】:2017-07-27 16:44:22
【问题描述】:
TL;DR
当我尝试反序列化 PullSheet 对象(下面的类)时,我得到一个 java.io.NotSerializableException。我哪里错了?
编辑:向问题类添加空构造函数后,我现在得到一个“不兼容”异常。
堆栈跟踪:
java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:606)
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1772)
java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
java.io.ObjectInputStream.readObject(ObjectInputStream.java:373)
com.campusden.learning.movingdata.ScannerActivity.loadSheet(ScannerActivity.java:271)
com.campusden.learning.movingdata.ScannerActivity.onCreate(ScannerActivity.java:79)
android.app.Activity.performCreate(Activity.java:6679)
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
android.app.ActivityThread.-wrap12(ActivityThread.java)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
android.os.Handler.dispatchMessage(Handler.java:102)
android.os.Looper.loop(Looper.java:154)
android.app.ActivityThread.main(ActivityThread.java:6119)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
问题
我正在尝试序列化 PullSheet 对象,以便存储简单的数据备份并作为用户的功能要求。我能够毫无例外地序列化对象,但是当我尝试反序列化时,我在 PullItem 类上得到一个 java.io.NotSerializableException。
代码
PullSheet.java
import ...
public class PullSheet implements Serializable{
protected String pullerName;
protected String role;
protected String store;
protected String sheetId;
protected String runItId;
protected String date;
protected UUID uuid;
protected String serialName;
protected Long startTime = System.currentTimeMillis();
protected ArrayList<PullItem> SheetItems = new ArrayList<PullItem>();
public void createSheet(String _pullerName, String _role, String _store, String _runItId){
setPullerName(_pullerName);
setRole(_role);
setStore(_store);
setRunItId(_runItId);
setSerialName();
setDate();
setUuid();
setSheetId();
}
protected void addItem(String sku, Integer qty){
SheetItems.add(new PullItem(sku, qty));
}
protected void removeItem(PullItem item){
this.SheetItems.remove(item);
}
//Getters and setters
public String getPullerName(){ return pullerName; }
public String getRole(){ return role; }
public String getStore(){ return store; }
public String getRunItId(){ return runItId; }
public String getSheetId(){ return sheetId; }
public Long getStartTime(){ return startTime; }
public UUID getUuid() { return uuid; }
private void setPullerName(String _pullerName){ pullerName = _pullerName; }
private void setRole(String _role){ pullerName = _role; }
private void setStore(String _store){ store = _store; }
private void setRunItId(String _runItId){ runItId = _runItId; }
private void setSerialName(){ serialName = this.store + "-" + this.date + "_" + this.uuid; }
private void setUuid(){ uuid = UUID.randomUUID(); }
private void setDate() {
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
this.date = formatter.format(new Date(this.startTime));
}
private void setSheetId(){
String randUUID = uuid.toString();
sheetId = this.date + "-" + this.store + "-" + this.pullerName + "-" + randUUID + "-" + this.runItId;
}
}
PullItem.java
import ...
public class PullItem implements Serializable {
protected String sku;
protected Integer qty;
public PullItem(String sku, Integer qty) {
setSku(sku);
setQty(qty);
}
public PullItem(String sku) {
setSku(sku);
this.qty = 1;
}
String getSku(){
return sku;
}
Integer getQty(){
return qty;
}
void setSku(String _sku){
sku = _sku;
}
void setQty(Integer _qty){
qty = _qty;
}
void incrementQty(){
qty += 1;
}
}
序列化和反序列化 PullSheet 对象的函数:
public static boolean saveSheet(Context context, PullSheet sheet){
String fileName = "saved.szs";
try {
FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
Log.d("rep", fileName);
oos.writeObject(sheet);
oos.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
public static PullSheet loadSheet(Context context, String fileName) {
try {
FileInputStream fis = context.openFileInput(fileName);
ObjectInputStream is = new ObjectInputStream(fis);
Object readObject = is.readObject();
is.close();
if(readObject != null && readObject instanceof PullSheet) {
return (PullSheet) readObject;
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
我需要什么
请告诉我哪里出错了。我认为这不是导致异常的类型,因为所有类都实现了 Serializable,但我可能会离开。在此先感谢您的帮助
【问题讨论】:
-
你能不能尝试定义一个空的构造函数
-
你传递
PullSheet的子类吗? -
“我得到一个 java.io.NotSerializableException”——请编辑您的问题并提供与此异常相关的完整 Java 堆栈跟踪。
-
添加空构造函数添加“本地类不兼容:stream classdsc serialversionUID = x
-
对不起,我忽略了,它在 readObject 中。因此,您可能正在尝试加载以前保存的内容,然后添加了一些变量,或者由于您尚未定义 serialVersionUUID,因此无法反序列化对象,可能是因为现在计算的 serialVersionUUID 是与以前的不同。
标签: java android serialization