什么是序列化对象?

  我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatterning 等等,都是一个意思。

  序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上(因为硬盘或网络传输时只接受bytes)。

  反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpacking。

为什么要序列化?

  举个例子,你在打游戏过程中,打累了,停下来,想过两天再玩,两天之后,游戏又从你上次停止的地方继续运行,你上次游戏的进度肯定保存到硬盘上了,那么是以何种形式呢?游戏过程中产生的很多临时数据是不规律的,可能在你关掉游戏时正好是10个列表,3个嵌套字典的数据集合在内存里面,需要存下来,你如何存?把列表变成文件里的多行多列形式?那嵌套字典呢?根本没法存吧,所以,若是有种办法可以直接把内存数据存到硬盘上,下次程序再启动,再从硬盘上读出来,还是原来的格式,那是最好的,所以这就是我们要说的序列化。

1、持久保存状态

  一个软件/程序的执行就在处理一系列状态的变化,在编程语言中,‘状态’会以各种各样有结构的数据类型(也可以简单的理解为变量)的形式被保存在内存中

  内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。

  在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。

2、跨平台数据交互

  序列化之后,不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好使用一种序列化的格式,那么变打破了平台/语言差异化带来的限制,实现了跨平台的数据交互。

  反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling.

什么可以序列化操作?

  在python中,可以使用pickle和json两个模块对数据进行序列化操作

其中:

  • json可以用于字符串或者字典等与python数据类型之间的序列化与反序列化操作
  • pickle可以用于python特有类型与python数据类型之间的序列化与反序列化操作

提问:这时候有人肯定要问,两个都可以对数据进行序列化,为什么不只学习一个就好了,非要学习两个呢?

这个问题问的好,我们下面详细讲一下两个的区别。
关于json
    优点:跨语言,体积小
    缺点:只能支持int(整形),str(字符串),list(列表),tuple(元祖),dict(字典)

关于pickle
    优点:专门为python设计,只支持python所有的数据类型
    缺点:只能在python中使用,存储数据占空间大

下面主要说一下json和pickle模块

json模块

什么是json?

  JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。它是基于 JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON采用完全独立于程序语言的文本格式,但是也使用了类C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

  如果我们要在不同的编程语言中传递对象,就必须把对象序列化称为标准格式,比如XML,但是更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有的语言读取,也可以方便的存储到磁盘或者通过网络传输。JSON不仅是标准格式,而且比XML更快,而且可以在web页面直接读取,非常方便。

1.查看json模块内的方法

import json
dir(json)
['JSONDecodeError', 'JSONDecoder', 'JSONEncoder', '__all__', '__author__', '__builtins__',
 '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__',
'__spec__', '__version__', '_default_decoder', '_default_encoder', 'codecs', 'decoder',
 'detect_encoding', 'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner']

2.json模块提供了四个常用的功能:dumps,dump,loads,load

  其中:json.dumps()方法可以将字典等数据(特殊的形式)格式化成一个所有语言认识的字符串,这样可以方便别的编程语言调用

import json
data = {
    'roles':[
        {'role':'monster','type':'pig','life':50},
        {'role':'donkey','type':'dog','life':60},
    ]
}
j_str = json.dumps(data)
print("以前的数据类型:",type(data),data)
print("通过json转化后的数据类型",type(j_str),j_str)
# 以前的数据类型: <class 'dict'> {'roles': [{'role': 'monster', 'type': 'pig', 'life': 50}, {'role': 'donkey', 'type': 'dog', 'life': 60}]}
# 通过json转化后的数据类型 <class 'str'> {"roles": [{"role": "monster", "type": "pig", "life": 50}, {"role": "donkey", "type": "dog", "life": 60}]}

  json.loads()方法可以进行反序列化

import json
data = {
    'roles':[
        {'role':'monster','type':'pig','life':50},
        {'role':'donkey','type':'dog','life':60},
    ]
}
j_str = json.dumps(data)
ww = json.loads(j_str)
print("原来的格式:",type(j_str),j_str)   #json把字典读成字符串
print("反序列化:",type(ww),ww)              #通过loads反序列化成字典
# 原来的格式: <class 'str'> {"roles": [{"role": "monster", "type": "pig", "life": 50}, {"role": "donkey", "type": "dog", "life": 60}]}
# 反序列化: <class 'dict'> {'roles': [{'role': 'monster', 'type': 'pig', 'life': 50}, {'role': 'donkey', 'type': 'dog', 'life': 60}]}

  json.dump()方法可以把字典等数据类型(特殊的形式)序列化成所有程序语言认识的字符串,进入一个文件中,等待别的程序进行调用

import json

f = open('study.json','w')
dd = json.dump(data,f)
print(dd,type(dd))
#None <class 'NoneType'>   因为这个是在python读取的,它本来是大家都认识的,所以没有任何类型,
#json.dump将数据通过特殊的形式转化为所有语言都认识的字符串,并写入文件

  json.load()方法可以读取文件中的内容

import json
f = open('study.json','r')
read_load = json.load(f)
print("读取的类型和内容 ",type(read_load),read_load)
结果:
读取的类型和内容  <class 'dict'> {'roles': [{'role': 'monster', 'type': 'pig', 'life': 50}, {'role': 'donkey', 'type': 'dog', 'life': 60}]}

易错点:如何把一个文件内的字符串形式通过json转化为相应的字典格式?

  常见错误:

#account_file是文件的绝对路径
with open(account_file, "r", encoding="utf-8") as f:   #打开文件
  file_data = json.load(account_file)
    print(file_data)

这样竟然出错了!!
错误信息:AttributeError: 'str' object has no attribute 'read'

  改正后为:

#改正:
if os.path.isfile(account_file):     #如果用户文件存在(即用户存在)
    with open(account_file, "r", encoding="utf-8") as f:   #打开文件
        file_data = json.load(f)
        print(file_data)

下面我们来测试一下json字符串和json对象到底是什么?

import json
i=10
s='hello'
t=(1,4,6)
l=[3,5,7]
d={'name':"james"}

json_str1=json.dumps(i)
json_str2=json.dumps(s)
json_str3=json.dumps(t)
json_str4=json.dumps(l)
json_str5=json.dumps(d)

print(json_str1)   #'10'
print(json_str2)   #'"hello"'
print(json_str3)   #'[1, 4, 6]'
print(json_str4)   #'[3, 5, 7]'
print(json_str5)   #'{"name": "james"}'

  这里面的json_str就是json字符串。

JSON字符串内的值:

  • 数字    (整数或浮点数)
  • 字符串 (在双引号中)
  • 逻辑值 (true 或 false)
  • 数组    (在方括号中)
  • 对象    (在花括号中,引号用双引)
  • null

  请大家记住一句话:json字符串就是js对象的一种表现形式(字符串的形式)

  JSON表示的对象就是标准的Javascripts语言的对象,JSON和Python内置的数据类型如下:

JSON类型 python类型
{} dict
[] list
"string" str
"123456" int或float
true/false True/False
null None

或者看下表,更清晰:

python     -->         json

dict                        object
list,tuple                 array
str,unicode             string
int,long,float           number
True                       true
False                      false
None                       null

  下面看一个带方法的json对象:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>

<script>
    var person = {
        "name":"james",
        "sex":"men",
        "teacher":{
            "name":"denken",
            "sex":"male",
        },
        "boddy":["basketball","running"],
        "getName":function () {
            return 80;
        }
    };
    alert(person.name);
    alert(person.getName());
    alert(person.teacher.name);
    alert(person.boddy[0]);

</script>
</html>

parse()

parse()  用于从一个json字符串中解析出json对象

如:var str = '{"name":"james","age":"23"}'

结果:JSON.parse(str)     ------>  Object  {age: "23",name: "james"} 

.stringify()

stringify() 用于从一个json对象解析成json字符串

如   var c = {a:1 , b:2 }

结果: JSON.stringify(c)     ------>      '{"a":1,"b":2}'

注意事项

注意1:单引号写在{}外,每个属性名都必须用双引号,否则会抛出异常。

a={name:"james"};   //ok
b={'name':'james'}; //ok
c={"name":"james"}; //ok

alert(a.name);  //ok
alert(a[name]); //undefined
alert(a['name']) //ok

pickle模块

1.查看pickle模块内的方法

import pickle
dir(pickle)
['ADDITEMS', 'APPEND', 'APPENDS', 'BINBYTES', 'BINBYTES8', 'BINFLOAT', 'BINGET',
'BININT', 'BININT1', 'BININT2', 'BINPERSID', 'BINPUT', 'BINSTRING', 'BINUNICODE',
'BINUNICODE8', 'BUILD', 'DEFAULT_PROTOCOL', 'DICT', 'DUP', 'EMPTY_DICT', 'EMPTY_LIST',
'EMPTY_SET', 'EMPTY_TUPLE', 'EXT1', 'EXT2', 'EXT4', 'FALSE', 'FLOAT', 'FRAME', 'FROZENSET',
 'FunctionType', 'GET', 'GLOBAL', 'HIGHEST_PROTOCOL', 'INST', 'INT', 'LIST', 'LONG',
 'LONG1', 'LONG4', 'LONG_BINGET', 'LONG_BINPUT', 'MARK', 'MEMOIZE', 'NEWFALSE',
 'NEWOBJ', 'NEWOBJ_EX', 'NEWTRUE', 'NONE', 'OBJ', 'PERSID', 'POP', 'POP_MARK', 'PROTO',
'PUT', 'PickleError', 'Pickler', 'PicklingError', 'PyStringMap', 'REDUCE', 'SETITEM', 'SETITEMS',
 'SHORT_BINBYTES', 'SHORT_BINSTRING', 'SHORT_BINUNICODE', 'STACK_GLOBAL', 'STOP',
'STRING', 'TRUE', 'TUPLE', 'TUPLE1', 'TUPLE2', 'TUPLE3', 'UNICODE', 'Unpickler',
 'UnpicklingError', '_Framer', '_Pickler', '_Stop', '_Unframer', '_Unpickler', '__all__',
'__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__',
 '__spec__', '_compat_pickle', '_dump', '_dumps', '_extension_cache', '_extension_registry',
'_getattribute', '_inverted_registry', '_load', '_loads', '_test', '_tuplesize2code', 'bytes_types',
 'codecs', 'compatible_formats', 'decode_long', 'dispatch_table', 'dump', 'dumps',
 'encode_long', 'format_version', 'io', 'islice', 'load', 'loads', 'maxsize', 'pack', 'partial',
're', 'sys', 'unpack', 'whichmodule']

2.想查看某个方法的帮助文档

help(pickle.modules_name)  #就是help()+pickle.模块名
#这样就可以得到模块方法的帮助文档

3.pickle模块常用的方法有:dumps,loads,dump,load

  pickle.dumps对数据进行序列化操作

import pickle
data = {
    'roles':[
        {'role':'monster','type':'pig','life':50},
        {'role':'donkey','type':'dog','life':60},
    ]
}
lis = [1,2,3,4,'rain']
res_lis = pickle.dumps(lis)
res_dic = pickle.dumps(data)
print(type(res_lis),res_lis)
print(type(res_dic),res_dic)
# <class 'bytes'> b'\x80\x03]q\x00(K\x01K\x02K\x03K\x04X\x04\x00\x00\x00rainq\x01e.'
# <class 'bytes'> b'\x80\x03}q\x00X\x05\x00\x00\x00rolesq\x01]q\x02(}q\x03(X\x04\x00\x00\x00roleq\x04X\x07\x00\x00\x00monsterq\x05X\x04\x00\x00\x00typeq\x06X\x03\x00\x00\x00pigq\x07X\x04\x00\x00\x00lifeq\x08K2u}q\t(h\x04X\x06\x00\x00\x00donkeyq\nh\x06X\x03\x00\x00\x00dogq\x0bh\x08K<ues.'
#将data写入文件中
pk = open('data.pkl','wb')
print(type(pk),pickle.dump(data,pk))
# <class '_io.BufferedWriter'> None

  使用pickle.loads进行反序列化操作

import pickle
data = {
    'roles':[
        {'role':'monster','type':'pig','life':50},
        {'role':'donkey','type':'dog','life':60},
    ]
}
lis = [1,2,3,4,'rain']
res_lis = pickle.dumps(lis)
res_dic = pickle.dumps(data)
back_reslis = pickle.loads(res_lis)
back_resdic = pickle.loads(res_dic)
print(type(back_reslis),back_reslis)
print(type(back_resdic),back_resdic)
# <class 'list'> [1, 2, 3, 4, 'rain']
# <class 'dict'> {'roles': [{'role': 'monster', 'type': 'pig', 'life': 50}, {'role': 'donkey', 'type': 'dog', 'life': 60}]}

  pickle.dump() 将数据通过特殊的形式转化为只有python语言认识的字符串,并写入文件

import pickle
data = {
    'roles':[
        {'role':'monster','type':'pig','life':50},
        {'role':'donkey','type':'dog','life':60},
    ]
}
pk = open('data.pkl','wb')
print(type(pk),pickle.dump(data,pk))

  pickle.load()对文件进行反序列化,得到文件里面保存的数据

import pickle
data = {
    'roles':[
        {'role':'monster','type':'pig','life':50},
        {'role':'donkey','type':'dog','life':60},
    ]
}

with open('data.pkl','rb') as f:
    result  = pickle.load(f)
    print(result)
    # {'roles': [{'role': 'monster', 'type': 'pig', 'life': 50}, {'role': 'donkey', 'type': 'dog', 'life': 60}]}

shelve模块

shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,返回类似于字典的对象,可读可写;key必须是字符串,二值可以持久化任何pickle可支持的python数据格式  

shelve模块很简单,只有一个open函数,json和pickle模块只能dumps和loads只能一次,但是shelve就能dumps多次。这就是shelve存在的必要性,其中shelve对pickle进行了包装,是一个键值对的形式。

序列化

import shelve
f = shelve.open('shelve_test')
names = ['laex','howard','batumu']
info = {'name':'howard','age':22}

f['names'] = names     #持久化列表
f['info_dic'] = info

f.close()

反序列化

import shelve

d = shelve.open('shelve_test')   #打开一个文件

print(d['name'])
print(d['info_dic'])

# del d['test']  #还可以删除
# ['laex', 'howard', 'batumu']
# {'name': 'howard', 'age': 22}

xml模块

什么是xml模块呢?

  xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。

xml的格式如下,就是通过<>节点来区别数据结构的:

xml数据

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

xml协议在各个语言里的都 是支持的,在python中可以用以下模块操作xml:

import xml.etree.ElementTree as ET

tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root.tag)

#遍历xml文档
for child in root:
    print(child.tag, child.attrib)
    for i in child:
        print(i.tag,i.text)

#只遍历year 节点
for node in root.iter('year'):
    print(node.tag,node.text)
#---------------------------------------

import xml.etree.ElementTree as ET

tree = ET.parse("xmltest.xml")
root = tree.getroot()

#修改
for node in root.iter('year'):
    new_year = int(node.text) + 1
    node.text = str(new_year)
    node.set("updated","yes")

tree.write("xmltest.xml")

#删除node
for country in root.findall('country'):
   rank = int(country.find('rank').text)
   if rank > 50:
     root.remove(country)

tree.write('output.xml')

自己创建的xml文档

创建xml文档

import xml.etree.ElementTree as ET

new_xml = ET.Element("namelist")
name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
age = ET.SubElement(name,"age",attrib={"checked":"no"})
sex = ET.SubElement(name,"sex")
sex.text = '33'
name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
age = ET.SubElement(name2,"age")
age.text = '19'

et = ET.ElementTree(new_xml) #生成文档对象
et.write("test.xml", encoding="utf-8",xml_declaration=True)

ET.dump(new_xml) #打印生成的格式

  注意:自己创建xml文档的时候一定不要把代码文件名称命名为xml.py,不然会报错,因为Python引用包的时候应该是先在代码文件所在的文件夹查找,把文件名命名为xml.py时,import xml.etree.Element 这一句就在当前文件夹找到了自身源文件,自己写的xml.py里面根本就没有etree.Element这些模块,当然是要报错了。

Json和XML的比较

一,可读性

  JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。

二,可扩展性

  XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。

三,编码难度

  XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有提供的工具。无工具的情况下,相信熟练的开发人员一样能很快的写出想要的xml文档和JSON字符串,不过,xml文档要多很多结构上的字符。

四,解码难度

XML的解析方式有两种:

  • 一是通过文档模型解析,也就是通过父标签索引出一组标记。例如:xmlData.getElementsByTagName("tagName"),但是这样是要在预先知道文档结构的情况下使用,无法进行通用的封装。
  • 另外一种方法是遍历节点(document 以及 childNodes)。这个可以通过递归来实现,不过解析出来的数据仍旧是形式各异,往往也不能满足预先的要求。

凡是这样可扩展的结构数据解析起来一定都很困难。

  JSON也同样如此。如果预先知道JSON结构的情况下,使用JSON进行数据传递简直是太美妙了,可以写出很实用美观可读性强的代码。如果你是纯粹的前台开发人员,一定会非常喜欢JSON。但是如果你是一个应用开发人员,就不是那么喜欢了,毕竟xml才是真正的结构化标记语言,用于进行数据传递。

  而如果不知道JSON的结构而去解析JSON的话,那简直是噩梦。费时费力不说,代码也会变得冗余拖沓,得到的结果也不尽人意。但是这样也不影响众多前台开发人员选择JSON。因为json.js中的toJSONString()就可以看到JSON的字符串结构。当然不是使用这个字符串,这样仍旧是噩梦。常用JSON的人看到这个字符串之后,就对JSON的结构很明了了,就更容易的操作JSON。

  以上是在Javascript中仅对于数据传递的xml与JSON的解析。在Javascript地盘内,JSON毕竟是主场作战,其优势当然要远远优越于xml。如果JSON中存储Javascript复合对象,而且不知道其结构的话,我相信很多程序员也一样是哭着解析JSON的。

  除了上述之外,JSON和XML还有另外一个很大的区别在于有效数据率。JSON作为数据包格式传输的时候具有更高的效率,这是因为JSON不像XML那样需要有严格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输压力。

python序列化及其相关模块(json,pickle,shelve,xml)详解的更多相关文章

  1. python笔记-7(shutil/json/pickle/shelve/xml/configparser/hashlib模块)

    一.shutil模块--高级的文件.文件夹.压缩包处理模块 1.通过句柄复制内容 shutil.copyfileobj(f1,f2)对文件的复制(通过句柄fdst/fsrc复制文件内容) 源码: Le ...

  2. python模块--json \ pickle \ shelve \ XML模块

    一.json模块 之前学习过的eval内置方法可以将一个字符串转成一个python对象,不过eval方法时有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,e ...

  3. 常用模块(json/pickle/shelve/XML)

    一.json模块(重点) 一种跨平台的数据格式 也属于序列化的一种方式 介绍模块之前,三个问题: 序列化是什么? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化. 反序列化又是什么? 将 ...

  4. 模块 - json/pickle/shelve/xml/configparser

    序列化: 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. 为什么要序列化: 有种办法可以直接把内存数据(eg:10个列表,3 ...

  5. python 全栈开发,Day25(复习,序列化模块json,pickle,shelve,hashlib模块)

    一.复习 反射 必须会 必须能看懂 必须知道在哪儿用 hasattr getattr setattr delattr内置方法 必须能看懂 能用尽量用__len__ len(obj)的结果依赖于obj. ...

  6. python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

    python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess ...

  7. python中日志logging模块的性能及多进程详解

    python中日志logging模块的性能及多进程详解 使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析.Python的 ...

  8. python 序列化及其相关模块(json,pickle,shelve,xml)详解

    什么是序列化对象? 我们把对象(变量)从内存中编程可存储或传输的过程称之为序列化,在python中称为pickle,其他语言称之为serialization ,marshalling ,flatter ...

  9. python开发模块基础:序列化模块json,pickle,shelve

    一,为什么要序列化 # 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化'''比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文 ...

随机推荐

  1. 【NOIP2012普及组】质因数分解

    P1075 质因数分解 假期第一天就给一道入门难度的题写题解…… 这道题一开始就被我想复杂了:埃式筛,欧拉筛……然而开一个1e9的数组?不现实. 直到看到题解区的dalao用唯一分解定理: 算术基本定 ...

  2. python3 求一个list的所有子集

    python3 求一个list的所有子集 def PowerSetsBinary(items): N = len(items) for i in range(2 ** N):#子集的个数 combo ...

  3. 安装node.js后npm不可用

    安装node.js后npm不可用 最近要用Vue做项目,依赖node.js,于是按官网下载安装node 下载地址:https://nodejs.org/en/download/ 网上也有很多教程这里就 ...

  4. Flink架构(三)- 事件-时间(Event-Time)处理

    3. 事件-时间(Event-Time)处理 在“时间语义”中,我们强调了在流处理应用中时间语义的重要性,并解释了处理时间与事件时间的不同点.处理时间较好理解,因为它基于本地机器的时间,它产生的是有点 ...

  5. CentOS 7下用firewall-cmd控制端口与端口转发

    # 将80端口的流量转发至192.168.0.1的8080端口 1.firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toad ...

  6. ansible笔记(7):常用模块之包管理模块

    1.yum_repository模块 用于远程管理远程主机上的yum仓库. 参数解析: name:必须参数,用于指定要操作的唯一的仓库ID,也就是.repo配置文件中每个仓库对应的“中括号”内的仓库I ...

  7. Custom LED Keychain, Small And Surefire Gifts

    The    LED Keychain    makes it easy for people to carry their keys with them and carry them with th ...

  8. (转)Java中的String与常量池

    Java中的String与常量池 转自:http://developer.51cto.com/art/201106/266454.htm string是java中的字符串.String类是不可变的,对 ...

  9. PTPX-功耗分析总结

    使用PrimeTime PX进行功耗分析有两种:一种是平均功耗的分析Averaged power analysis,一种是Time-based power analysis.   电路的功耗主要有两种 ...

  10. 大数据-hdfs技术

    hadoop 理论基础:GFS----HDFS:MapReduce---MapReduce:BigTable----HBase 项目网址:http://hadoop.apache.org/ 下载路径: ...