为了账号安全,请及时绑定邮箱和手机立即绑定

如何序列化和反序列化哈希表?

如何序列化和反序列化哈希表?

森栏 2022-12-15 14:47:39
我正在尝试但Serialize没有成功。DeserializeHashtable这是代码:反序列化    public static void read(File f) throws IOException, ClassNotFoundException    {        FileInputStream fos = new FileInputStream(f);        ObjectInputStream oos = new ObjectInputStream(fos);        list = new Hashtable<Date,String>((Hashtable<Date,String>)oos.readObject());        oos.close();    }连载    public static void write(String s) throws FileNotFoundException, IOException    {        FileOutputStream fos = new FileOutputStream(s);        ObjectOutputStream oos = new ObjectOutputStream(fos);        oos.writeObject(list);    }我写了Class日期,它不是 Java 的,但我在implemet Serializable那里写了。在我打印它之后,我得到Deserialize了.Hashtable{}我究竟做错了什么?
查看完整描述

4 回答

?
慕的地8271018

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序列化正在按预期工作。


查看完整回答
反对 回复 2022-12-15
?
GCT1015

TA贡献1827条经验 获得超4个赞

我相信你应该在写完后冲水。

oos.writeObject(列表); oos.close();


查看完整回答
反对 回复 2022-12-15
?
偶然的你

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);

}


查看完整回答
反对 回复 2022-12-15
?
德玛西亚99

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);

    }

}

}


查看完整回答
反对 回复 2022-12-15
  • 4 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信