Java中为什么要序列化?什么时候用到序列化?

发布网友 发布时间:2022-04-23 22:45

我来回答

6个回答

懂视网 时间:2022-04-18 20:44

一、用途

  我们需要将内存中的数据进行序列化,即写入文件中时,写入的类型只能是字符串或者二进制类型。但是如果我们想要将复杂一些的数据类型,如:列表、字典或者函数之类的同样进行序列化,我们就要用到 json或者pickle。

二、json序列化

1、dumps序列化和loads反序列化

dumps把数据类型转换成字符串

import json

info = {
 'name': 'The Count of Monte Cristo',
 'type': 'Movie'
}

data = json.dumps(info)
print(data)
print(type(data))

# 
输出 {"name": "The Count of Monte Cristo", "type": "Movie"} <class 'str'>

loads把字符串转换成数据类型

import json

get_info = json.loads(data)
print(get_info['name'])
print(get_info)
print(type(get_info))

#
输出 The Count of Monte Cristo {'name': 'The Count of Monte Cristo', 'type': 'Movie'} <class 'dict'> 

2.dump序列化和load反序列化

dump把数据类型转换成字符串并存储在文件中

import json

info = {
 'name': 'The Count of Monte Cristo',
 'type': 'Movie'
}

with open("test.txt", "w", encoding="utf-8") as f:
 json.dump(info, f) # 第一个参数是内存中的数据对象,第二个参数是文件句柄

#写入文件中的内容
{"name": "The Count of Monte Cristo", "type": "Movie"}

load把文件打开从字符串转换成数据类型

import json


with open("test.txt", "r", encoding="utf-8") as f:
 data_from_file = json.load(f)

print(data_from_file['name'])
print(data_from_file)
print(type(data_from_file))

#
输出 The Count of Monte Cristo {'name': 'The Count of Monte Cristo', 'type': 'Movie'} <class 'dict'>

  

3.json序列化一个函数

import json

def test(name):
 print("hello,{}".format(name))

info = {
 'name': 'The Count of Monte Cristo',
 'type': 'Movie',
 'func': test
}

data = json.dumps(info)

#
输出 File "G:/python/untitled/study6/json&pickle模块.py", line 22, in <module> data = json.dumps(info) File "G:pythoninstalllibjson\__init__.py", line 230, in dumps return _default_encoder.encode(obj) File "G:pythoninstalllibjsonencoder.py", line 198, in encode chunks = self.iterencode(o, _one_shot=True) File "G:pythoninstalllibjsonencoder.py", line 256, in iterencode return _iterencode(o, 0) File "G:pythoninstalllibjsonencoder.py", line 179, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: <function test at 0x0000021B13C57F28> is not JSON serializable

1、json只能处理简单的数据类型,例如:字典、列表、字符串等,不能处理函数等复杂的数据类型。

2、json是所有语言通用的,所有语言都支持json,如果我们需要python跟其他语言进行数据交互,那么就用json格式

 

三、pickle序列化

pickle的用法和上面的相同,但是pickle序列化后的数据类型是二进制的,并且pickle只能在python中是使用。

1.dumps && loads

import pickle


def test(name):
 print("hello,{}".format(name))

info = {
 'name': 'The Count of Monte Cristo',
 'type': 'Movie',
 'func': test
}

data = pickle.dumps(info)
print(data)
print(type(data))

#
输出 b'x80x03}qx00(Xx04x00x00x00nameqx01Xx19x00x00x00The Count of Monte Cristoqx02Xx04x00x00x00typeqx03Xx05x00x00x00Movieqx04Xx04x00x00x00funcqx05c__main__ test qx06u.' <class 'bytes'>

import pickle

get_data = pickle.loads(data)
get_data['func']('cat')
print(get_data)

#
输出 hello,cat {'name': 'The Count of Monte Cristo', 'type': 'Movie', 'func': <function test at 0x00000235350A7F28>}

  

2. dump && load

import pickle


def test(name):
 print("hello,{}".format(name))

info = {
 'name': 'The Count of Monte Cristo',
 'type': 'Movie',
 'func': test
}

with open('test.txt', 'wb') as f:
 pickle.dump(info, f)

# 写入test.txt文件中的内容

?}q (X typeqX MovieqX funcqc__main__
test
qX nameqX The Count of Monte Cristoqu.

  

import pickle

with open('test.txt', 'rb') as f:
 get_data = pickle.load(f)
print(get_data)

# 
输出 {'name': 'The Count of Monte Cristo', 'func': <function test at 0x000001BA2AB4D510>, 'type': 'Movie'}

  

总结:

  • json值支持简单的数据类型,pickle支持所有的数据类型。

  • pickle只能支持python本身的序列化和反序列化,不能用作和其他语言做数据交互,而json可以。

  • pickle序列化的是整个的数据对象,所以反序列化函数时,函数体中的逻辑变了,是跟着心的函数体走的。

  • 热心网友 时间:2022-04-18 17:52

    序列化可以将内存中的类写入文件或数据库中。比如将某个类序列化后存为文件,下次读取时只需将文件中的数据反序列化就可以将原先的类还原到内存中。也可以将类序列化为流数据进行传输。总的来说就是将一个已经实例化的类转成文件存储,下次需要实例化的时候只要反序列化即可将类实例化到内存中并保留序列化时类中的所有变量和状态。
    例如:hibernate中实体类的钝化就是将类序列化后存入磁盘并释放内存空间。

    热心网友 时间:2022-04-18 19:10

    序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

    序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

    热心网友 时间:2022-04-18 20:45

    对象、文件、数据,有许多不同的格式,很难统一传输和保存
    序列化以后就都是字节流了,无论原来是什么东西,都能变成一样的东西,就可以进行通用的格式传输或保存,传输结束以后,要再次使用,就进行反序列化还原,这样对象还是对象,文件还是文件

    热心网友 时间:2022-04-18 22:36

    我们的java程序必须要运行在java虚拟机中,那么在同一个java虚拟机进程中,换句话说是在同一快内存空间里面,什么地方需要用此对象,直接传递该对象的引用就可以了,我们想调某一个对象的方法,通过该对象的引用就可以了,传过去就可以了;

    那么我问你,如果是不同的java虚拟机进程呢?不同的内存空间呢?甚至我北京的计算机的java虚拟机中的某一个类,需要使用广州的某台计算机上的某个java对象呢?怎么办?

    这是不同的内存空间,你怎么调?

    热心网友 时间:2022-04-19 00:44

    序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
    序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements
    Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object
    obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com