java - 我在以下程序中得到 OptionalDataException。为什么会出现这个错误
问题描述
我试图在序列化之前加密密码
我在下面的代码中得到 OptionalDataException。我读了很多文章,例如“之前读取非瞬态变量,程序中的 EOF,以与您在文件中写入相同的方式读取等.. 但本文没有解决我的问题,这是我遇到错误的程序。
class MySerialization implements Serializable{
public String username;
public transient String password;
public MySerialization(){
}
public MySerialization(String pass,String user){
this.password=pass;
this.username=user;
}
public String getPassword(){
return this.password;
}
//Write CustomObject in file
private void writeObject(ObjectOutputStream oos) throws Exception{
oos.defaultWriteObject();
String pass= "HAS"+password;
oos.writeChars(pass);
}
private void readObject(ObjectInputStream ois) throws Exception{
ois.defaultReadObject();
String pass= (String)ois.readObject(); //Here getting Exception OptionalDataException
password= pass.substring(3);
}
public String getUsername(){
return this.username;
}
}
class MyTest {
public static void main(String args[]) throws Exception{
MySerialization my1=new MySerialization("123456","User1");
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("n.txt"));
oos.writeObject(my1);
oos.close();
MySerialization my2=new MySerialization();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("n.txt"));
my2=(MySerialization )ois.readObject();
System.out.println(my2.getUsername() +" "+my2.getPassword());
ois.close();
}
}
解决方案
您需要以相同的顺序写入/读取相同的类型。目前你正在写char
's 所以你也应该在读char
's。
一个例子(另请阅读char
):
private void readObject(ObjectInputStream ois) throws Exception{
ois.defaultReadObject();
StringBuilder passBuilder = new StringBuilder();
try {
while (true) {
passBuilder.append(ois.readChar());
}
} catch (EOFException e) {
// Reached end of stream.
} finally {
ois.close();
}
String pass = passBuilder.toString();
password = pass.substring(3);
}
第二个例子(写Object
):
private void writeObject(ObjectOutputStream oos) throws Exception{
oos.defaultWriteObject();
String pass= "HAS"+password;
oos.writeObject(pass);
}
推荐阅读
- gtsummary - 如何修改“gtsummary”中“all_categorical()”定义的默认变量类型?什么时候需要序数变量的平均值?
- unity3d - TimeSpan 的自定义 PropertyDrawer,问题设置 SerializedProperty longValue
- java - 如何使用 ArrayList 获取 TextField 输入
- django-orm - Django ORM 按小时分组,不包括分钟
- python - 如何将具有透明背景的图像带到我的 tkinter 窗口的前面?
- gekko - 如何在 Gekko 中使用 if2/3
- mysql - 从 MySql 中的查询数据透视表中清除空值
- elasticsearch - 如何从 Elastic Search 中的 json 字段中删除字段
- r - R函数从调用它的函数继承参数
- machine-learning - 第一次运行机器学习项目