Сериализация представляет собой процесс сохранения состояния объекта в долговременный вид, такой как файл или база данных, либо приведение к виду, пригодному для передачи между машинами.
Мой код на Python позволяет сохранять объекты, как раз в такой "долговременный вид". В качестве примера взята структура каталогов и файлов в ОС Windows, преобразование её в структуру словарь и дальнейшее сохранение данного объекта в XML и JSON.
Ниже привожу код программы:
Указанная директория была "D:\Films\Matrix_Trylogy" и ниже показан результат работы данного кода: XML-файл и JSON-файл.
XML-файл:
</nd>
JSON-файл:
{"Matrix_Revolutions": {"VIDEO_TS": {"VTS_02_0.BUP": null, "VTS_01_1.VOB": null, "VTS_01_3.VOB": null, "VTS_01_5.VOB": null, "VTS_01_0.IFO": null, "VTS_01_0.VOB": null, "VTS_01_2.VOB": null, "VIDEO_TS.BUP": null, "VTS_02_1.VOB": null, "VTS_02_0.IFO": null, "VTS_01_0.BUP": null, "VIDEO_TS.IFO": null, "VTS_01_4.VOB": null, "VIDEO_TS.VOB": null}}, "Matrix": {"VIDEO_TS": {"VTS_02_0.BUP": null, "VTS_01_1.VOB": null, "VTS_01_3.VOB": null, "VTS_01_5.VOB": null, "VTS_01_0.IFO": null, "VTS_01_0.VOB": null, "VTS_01_2.VOB": null, "VIDEO_TS.BUP": null, "VTS_02_1.VOB": null, "VTS_02_0.IFO": null, "VTS_01_0.BUP": null, "VIDEO_TS.IFO": null, "VTS_01_4.VOB": null, "VIDEO_TS.VOB": null}}, "Matrix_Reloaded": {"VIDEO_TS": {"VTS_02_0.BUP": null, "VTS_01_1.VOB": null, "VTS_01_3.VOB": null, "VTS_01_5.VOB": null, "VTS_01_0.IFO": null, "VTS_01_0.VOB": null, "VTS_01_2.VOB": null, "VIDEO_TS.BUP": null, "VTS_02_1.VOB": null, "VTS_02_0.IFO": null, "VTS_01_0.BUP": null, "VIDEO_TS.IFO": null, "VTS_01_4.VOB": null, "VIDEO_TS.VOB": null}}}
Спасибо за внимание!
Мой код на Python позволяет сохранять объекты, как раз в такой "долговременный вид". В качестве примера взята структура каталогов и файлов в ОС Windows, преобразование её в структуру словарь и дальнейшее сохранение данного объекта в XML и JSON.
Ниже привожу код программы:
Code Save To XML & JSON
import os
from xml.dom.minidom import Document
import json
from xml.etree.ElementTree import tostring
folder = "D:\\Films\\Matrix_Trilogy\\"
nodeDefinitor = "nd"
fileDefinitor = "file"
folderDefinitor = "folder"
def subDict(d, xmlNode, doc):
for name in d:
newNode = doc.createElement(nodeDefinitor)
newNodeText = doc.createTextNode(name)
if d[name] == None:
newNode.setAttribute(fileDefinitor, name)
else:
newNode.setAttribute(folderDefinitor, name)
#newNode.appendChild(newNodeText)
xmlNode.appendChild(newNode)
if (d[name] != {} and d[name] != None):
subDict(d[name], newNode, doc)
def saveDictionaryToXML(dic):
doc = Document()
root = doc.createElement(nodeDefinitor)
root.setAttribute(folderDefinitor, folder)
#rootText = doc.createTextNode(folder)
#root.appendChild(rootText)
doc.appendChild(root)
subDict(dic, root, doc)
f = open('C:\\test.xml', 'w')
f.write(doc.toxml())
f.close()
def parse(dir):
tree = {}
for i in os.listdir(dir):
a = os.path.join(dir, i)
if os.path.isdir(a):
tree[i] = parse(a)
else:
tree[i] = None
return tree
d = parse(folder)
print d
def saveDicionaryToJson(d):
stream = json.dumps(d)
f = open('C:\\test.json', 'w')
f.write(stream)
f.close()
return stream
saveDictionaryToXML(d)
saveDicionaryToJson(d)
from xml.dom.minidom import Document
import json
from xml.etree.ElementTree import tostring
folder = "D:\\Films\\Matrix_Trilogy\\"
nodeDefinitor = "nd"
fileDefinitor = "file"
folderDefinitor = "folder"
def subDict(d, xmlNode, doc):
for name in d:
newNode = doc.createElement(nodeDefinitor)
newNodeText = doc.createTextNode(name)
if d[name] == None:
newNode.setAttribute(fileDefinitor, name)
else:
newNode.setAttribute(folderDefinitor, name)
#newNode.appendChild(newNodeText)
xmlNode.appendChild(newNode)
if (d[name] != {} and d[name] != None):
subDict(d[name], newNode, doc)
def saveDictionaryToXML(dic):
doc = Document()
root = doc.createElement(nodeDefinitor)
root.setAttribute(folderDefinitor, folder)
#rootText = doc.createTextNode(folder)
#root.appendChild(rootText)
doc.appendChild(root)
subDict(dic, root, doc)
f = open('C:\\test.xml', 'w')
f.write(doc.toxml())
f.close()
def parse(dir):
tree = {}
for i in os.listdir(dir):
a = os.path.join(dir, i)
if os.path.isdir(a):
tree[i] = parse(a)
else:
tree[i] = None
return tree
d = parse(folder)
print d
def saveDicionaryToJson(d):
stream = json.dumps(d)
f = open('C:\\test.json', 'w')
f.write(stream)
f.close()
return stream
saveDictionaryToXML(d)
saveDicionaryToJson(d)
Указанная директория была "D:\Films\Matrix_Trylogy" и ниже показан результат работы данного кода: XML-файл и JSON-файл.
XML-файл:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
JSON-файл:
Спасибо за внимание!
Было бы прикольно древовидно отформатировать JSON.
ОтветитьУдалитьКроме того, тут нет упоминания, чем тебя не устраивает pickle и marshal сериализация. Я так понимаю, речь идет о человекочитаемости и интероперабельности с другими языками?
И что, кстати, на счет десериализации? будет ли твой JSON код автоматически понят как дикшинари?
ОтветитьУдалить