Serialization

joon·2021년 12월 9일
0

Serializtion이란?

When data structures need to be stored or transmitted to another location, such as across a network, they need to do through a porcess called serialization. This process converts and changes the data organiztion into a linear format that is needed for storage or transmission across computing device.
출처: https://www.cisecurity.org/blog/data-deserialization/

즉 직렬화란 데이터 객체를 바이트 스트림으로 변환하여 다른 네트워크나, 메모리, 데이터베이스등의 공간으로 전송하는 일련의 과정을 말한다.

예를 들면 Python의 Dictionary data object를 네트워크를 통해 Java HashMap을 사용하는 프로그램으로 전달 한다 쳐보자.
당연히 Python dictionary의 데이터 형식을 그대로 유지한채로 전달 할 수는 없다.

그렇다면 어떡해야할까? 이런경우 데이터를 어떻게 전달할지에 대한 약속을 wire protocol을 통해 정해 뒀는데 이를 만족하는 Serialization(Wire) Format으로 바꾸어 전송해야한다.
대표적인 Wire Format으로 TCP, XML, JSON, HTTP 등이 존재한다.

https://www.coursera.org/learn/python-network-data/lecture/b0dUA/13-1-data-on-the-web

XML

sample xml

<person>
  <name>JaeJun</name>
  <phone type="intl">
    +82 10 0101 1101
  </phone>
  <email hide="yes"/>
</person>

XML as a tree

   			<person>
	   <name>    <phone>	  <email>
attrs    text		
       
attrs = {'type':'intl',}
text = '+82 10 0101 1101'

XML as paths

/person/name 
or 
/person/phone

XML Validation

www.py4e.com

아 그래서 XML 어떻게 읽냐구~

import xml.etree.ElementTree as ET

input = '''
<stuff>
  <users>
    <user x="2">
      <id>001</id>
      <name>Chuck</name>
    </user>
    <user x="7">
      <id>009</id>
      <name>Brent</name>
    </user>
  </users>
</stuff>'''

stuff = ET.fromstring(input)
lst = stuff.findall('users/user')
print('User count:', len(lst))

for item in lst:
    print('Name', item.find('name').text)
    print('Id', item.find('id').text)
    print('Attribute', item.get('x'))
User count: 2
Name Chuck
Id 001
Attribute 2
Name Brent
Id 009
Attribute 7

xml.etree.find()에 인자로 전달할 paths 표기하는 법
https://www.w3schools.com/xml/xpath_syntax.asp 참조

JSON

sample json

import json

data = '''
{
  "name" : "Chuck",
  "phone" : {
    "type" : "intl",
    "number" : "+1 734 303 4456"
   },
   "email" : {
     "hide" : "yes"
   }
}'''

info = json.loads(data) 
print('Name:', info["name"]) # fina니 findall이니 쓸 필요가없고
#tag attribute같은 복잡한 것도 없다.
print('Hide:', info["email"]["hide"])

json.loads() 메소드를 사용해서 파이썬의 딕셔너리 구조와 일치하는 structured data를 반환 받을 수 있다.

XML과 달리 get()이니 find()이니 findall()이니 하는 메서드들도 없고 tag attribute도 따로 없으니 좀 더 사용하기 직관적이고 편한 것 같다.

일단 더 안궁금하니 패스~

0개의 댓글