221

我已经看到了使用 JSON 的术语“反序列化”和“序列化”。他们的意思是什么?

4

3 回答 3

349

JSON 是一种将对象编码为字符串的格式。序列化意味着将一个对象转换为那个字符串,而反序列化是它的逆操作(convert string -> object)

在传输数据或将它们存储在文件中时,要求数据是字节串,但复杂的对象很少采用这种格式。序列化可以将这些复杂的对象转换为字节串以供此类使用。字节串传输完毕后,接收方必须从字节串中恢复原始对象。这称为反序列化。

说,你有一个对象:

{foo: [1, 4, 7, 10], bar: "baz"}

序列化为 JSON 会将其转换为字符串:

'{"foo":[1,4,7,10],"bar":"baz"}'

可以存储或通过电线发送到任何地方。然后接收者可以反序列化这个字符串以取回原始对象。{foo: [1, 4, 7, 10], bar: "baz"}.

于 2010-07-23T09:07:13.633 回答
25

序列化和反序列化

在数据存储的上下文中,序列化(或序列化)是将数据结构或对象状态转换为可以存储(例如,在文件或内存缓冲区中)或传输(例如,通过网络连接)的格式的过程链接)并在以后重建。[...]

相反的操作,从一系列字节中提取数据结构,是反序列化。

资料来源:wikipedia.org

用 Python 解释

在 Python中,序列化只是将给定的数据结构转换为其有效的 JSON 挂件(例如,PythonTrue将转换为 JSON ,字典本身将转换为字符串),反序列true化反之亦然。

您可以很容易地发现 Python 和 JSON 表示之间的区别,例如,通过它们的布尔值。查看下表,了解两种上下文中使用的基本类型:

Python JSON
True true
False false
None null
int,float number
str(带有单引号'、双引号"和三"""引号) string(只有双"引号)
dict object
list,tuple array

代码示例

Python 内置模块json是进行序列化序列化的标准方法:

import json

data = {
    'president': {
        "name": """Mr. Presidente""",
        "male": True,
        'age': 60,
        'wife': None,
        'cars': ('BMW', "Audi")
    }
}

# serialize
json_data = json.dumps(data, indent=2)

print(json_data)
# {
#   "president": {
#     "name": "Mr. Presidente",
#     "male": true,
#     "age": 60,
#     "wife": null,
#     "cars": [
#       "BMW",
#       "Audi"
#     ]
#   }
# }

# deserialize
restored_data = json.loads(json_data) # deserialize

资料来源:realpython.comgeeksforgeeks.org

于 2019-03-19T12:24:35.930 回答
2

使用 Python 进行序列化和反序列化的解释

在 python 中,pickle 模块用于序列化。因此,序列化过程在 Python中称为酸洗。该模块在 Python 标准库中可用

使用pickle进行序列化

import pickle

#the object to serialize
example_dic={1:"6",2:"2",3:"f"}

#where the bytes after serializing end up at, wb stands for write byte
pickle_out=open("dict.pickle","wb")
#Time to dump
pickle.dump(example_dic,pickle_out)
#whatever you open, you must close
pickle_out.close()

PICKLE 文件(可以用记事本等文本编辑器打开)包含以下内容(序列化数据):

€}q (KX 6qKX 2qKX fqu.

使用pickle反序列化

import pickle

pickle_in=open("dict.pickle","rb")
get_deserialized_data_back=pickle.load(pickle_in)

print(get_deserialized_data_back)

输出:

{1:'6',2:'2',3:'f'}

于 2019-10-30T19:01:54.693 回答