4 回答
TA贡献1796条经验 获得超4个赞
在我反序列化Hashtable并打印它之后,我得到了{}.
我究竟做错了什么?
此代码是从您的 MCVE 代码复制而来的。您已经将其编辑掉了,但我相信这个或类似的东西是您问题的真正原因。
public static void write(String s) throws FileNotFoundException, IOException
{
list = new Hashtable<Date,String>();
FileOutputStream fos = new FileOutputStream(s);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(list);
}
您应该调用close(),oos但这不是真正的问题。
(丢失close() 可能会导致序列化文件为空或不完整/损坏,但这不会导致您读回空Hashtable的 .new FileOutputStream(s)
真正的问题是方法的第一条语句。您无条件地将一个新的空值分配Hashtable给list. 然后你在写它。所以(自然地)当你读回你写入文件的内容时,你会Hashtable再次得到一个空的。这就是{}你所看到的意思。
简而言之,您的代码正在写出一个空表并再次读回。Hashtable序列化正在按预期工作。
TA贡献1841条经验 获得超3个赞
您是否正在向文件写入任何内容,因为 write 方法将 String 作为参数,但您尚未指定要写入哪个文件。尝试:
public static void write(File f) throws FileNotFoundException, IOException
{
FileOutputStream fos = new FileOutputStream(f);
ObjectOutputStream oos = new ObjectOutputStream(fos);
Hashtable<Date, String> list = new Hashtable<>();
list.put(YourDateObject, "String");
oos.writeObject(list);
}
TA贡献1770条经验 获得超3个赞
这是代码示例:
public class Main {
/**
* File name
*/
private final static String FILENAME = "test.bin";
/**
* Entry point
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Hashtable<Date, String> original = new Hashtable<>();
// write some data to hashtable
for (int i = 0; i < 3; i ++) {
original.put(new Date(), String.valueOf(i));
TimeUnit.MILLISECONDS.sleep(100);
}
// serialize
write(FILENAME, original);
// deserialize
Hashtable<Date, String> restored = read(FILENAME);
// compare results
System.out.println(restored);
System.out.println(restored);
}
/**
* Deserialization
*
* @param filename
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static Hashtable<Date, String> read(String filename) throws IOException, ClassNotFoundException {
try (ObjectInputStream oos = new ObjectInputStream(new FileInputStream(filename))) {
return (Hashtable<Date, String>) oos.readObject();
}
}
/**
* Serialization
*
* @param filename
* @param list
* @throws FileNotFoundException
* @throws IOException
*/
public static void write(String filename, Hashtable<Date, String> list) throws FileNotFoundException, IOException {
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename))) {
oos.writeObject(list);
}
}
}
添加回答
举报