CS61B-Lab6 持久化(Persistence)&序列化(Serializable)

这一个lab主要是关于持久化(persistence)和main方法中的String[] args变量

String[] args

java xxx.java args1 args2 ...

这其中的args1,args2等就是传入main方法的args参数的量

就拿后面持久化练习的例子来说

java main.java story hello,world

在这里args[0]就是story,args[1]就是hello,world

持久化(Persistence)&序列化(Serializable)

GLM给出的解释:

  1. 序列化(Serialization): 序列化是将对象的状态信息转换为可以存储或传输的形式的过程。这样,在需要时可以重新创建该对象。序列化通常用于将内存中的对象保存到文件、数据库或通过网络传输到其他系统。它使得对象的字节流表示可以被存储或传输,然后通过反序列化过程恢复成原始对象。
  1. 持久化(Persistence): 持久化是指将数据存储到可永久保存的存储介质中的过程,以便在程序结束后数据仍然可以保留。持久化可以看作是序列化的一种形式,但它的目的更加广泛,不仅限于对象的序列化。它包括将数据保存到数据库、文件系统或其他任何形式的长期存储中。

Lab6的引入

Writing text to files is great and all, but what if we want to save some more complex state in our program? For example, what if we want to be able to save the Model object in 2048 so we can come back to it later? We could write a toString method to convert a Model to a String and then write that String to a file. However, we’d then have to also write code that is able to read the String and then parse it back into a Model. While it is certainly possible to do so, it’s tedious to write such code.

我们运行一个程序,当程序终止的时候,信息就丢失了,如果我们想重新运行,并从上次终端的地方继续该怎么办呢?这时候就要用到持久化了。

序列化

如果一个类想要使用序列化,那么这个类首先得实现Serializable接口

import java.io.Serializable;
public class Model implements Serializable {
    ...
}

这个接口本身没有方法,只是简单的标记它的子类为一些特殊的Java类,可以在对象上实现I/O操作(英文小白的理解)

原文:This interface has no methods; it simply marks its subtypes for the benefit of some special Java classes for performing I/O on objects.

例如下面给出序列化和反序列化的两个例子

序列化

Model m = ....;
File outFile = new File(saveFileName);
try {
    ObjectOutputStream out =
        new ObjectOutputStream(new FileOutputStream(outFile));
    out.writeObject(m);
    out.close();
} catch (IOException excp) {
    ...
}

反序列化

Model m;
File inFile = new File(saveFileName);
try {
    ObjectInputStream inp =
        new ObjectInputStream(new FileInputStream(inFile));
    m = (Model) inp.readObject();
    inp.close();
} catch (IOException | ClassNotFoundException excp) {
    ...
    m = null;
}

但是贴心的61B为我们提供了一个工具类,可以让这个操作不过于繁琐

序列化方法

Model m;
File outFile = new File(saveFileName);

// Serializing the Model object
writeObject(outFile, m);

反序列化方法

Model m;
File inFile = new File(saveFileName);

// Deserializing the Model object
m = readObject(inFile, Model.class);

Canine Capers(序列化的小练习)

理解了序列化并查看61B提供的Utils类就可以很轻松的写出来,没什么坑点

JVM调试

遇到的问题

$ python3 runner.py --debug our/test02-two-part-story.in

Traceback (most recent call last):

  File "/Users/yu/Documents/studyAbout/codeLearn/cs61b/cs61b-sp21/lab6/testing/runner.py", line 444, in <module>

    lib_dir = join(abspath(environ['REPO_DIR']),

                           ~~~~~~~^^^^^^^^^^^^

  File "<frozen os>", line 685, in __getitem__

KeyError: 'REPO_DIR'

解决办法
之前Lab1中的环境没配好,如果你和我一样是Mac的zsh,只需要往~/.zprofile里面加一行

export REPO_DIR=<你的仓库的路径>

终端输入echo $REPO_DIR,当出现你的仓库路径就没问题了

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇