TL;DR
当我尝试反序列化 PullSheet 对象(下面的类)时,出现 java.io.NotSerializedException。我哪里出错了?
编辑:向问题类添加空构造函数后,我现在收到“不兼容”异常。
堆栈跟踪:
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 对象,以便存储简单的数据备份并作为用户的功能要求。我能够毫无异常(exception)地序列化该对象,但是当我尝试反序列化时,我在 PullItem 类上收到 java.io.NotSerializedException。
代码
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
。那时你有一个异常(exception)。您修复了它以实现Serialized
。然后您尝试反序列化旧流。这不起作用。
编辑
After adding an empty constructor to the problem class I am now getting an "incompatible" exception.
因为您更改了隐式serialVersionUID
。 Serialized
类中不需要空构造函数。
编辑2
这里的一些人似乎没有意识到,当您尝试序列化一个不可序列化的对象时,NotSerializedException
会 (1) 抛出并 (2) 写入数据流,其方式如下:当您使用 readObject()
读取时到达它,它会再次抛出,与 OP 的堆栈跟踪中所示完全相同。
关于java - 当类实现 Serialized 时出现 NotSerializedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45356593/