'''
序列化与反序列化

按照某种规则,把内存中的数据保存到文件中,文件是一个字节序列,所以必须要把内存数据转换成为字节序列,输出到文件,这就是序列化;
反之,从文件的字节恢复到内存,就是反序列化;


'''

from json import dump,load
import os
import random
from model.User import User,MyEncoder

filepath = os.path.join(os.getcwd(), "assets\c3.json")
fp = open(filepath, 'w+')

userlist = []
for i in range(1, 10):
    u = User('', random.randint(15, 60))
    u.randName(random.randint(5, 10))
    userlist.append(u)

#序列化
dump(userlist, fp, cls=MyEncoder)
fp.close()

#反序列化
fp = open(filepath, 'r')
ul = load(fp)
print(ul)


# User, MyEncoder
import os
import sys
print(os.path.dirname(os.getcwd()))
sys.path.insert(0, os.path.dirname(os.getcwd()))


import json
import random
from decorator.Logger import Logger

class User:

    '''用户模型'''
    def __init__(self, name = '', age = 0):
        self.name = name
        self.age = age

    @property
    def Gender(self):
        return self.gender
    
    @Gender.setter
    def Gender(self, g: int):
        '''
        :g int 1=男,2=女
        '''
        if g not in [1, 2]:
            raise ValueError("Gender Value is not a valid")
        self.gender = g

    def getGenderText(self):
        genderDic = { 1: '男', 2: '女' }
        return genderDic[self.gender]
    
    @Logger()
    def intro(self):
        '''自我介绍'''
        print("My name is {}, My age is {}, My gender is {}".format(self.name, self.age, self.getGenderText()))

    def randName(self, len: int = 5):
        """
        根据传入的数字生成对应长度的随机字符串
        
        Parameters:
        len - 待生成的字符串长度
        
        Returns:
            None
        
        Raises:
            None
        """
        str = 'abcdefghijklmnopqrstuvwxyz'
        name = ''
        for i in range(len):
            idx = random.randint(0, 25)
            s = str[idx]
            if name == '':
                s = s.upper()
            name += s
        self.name = name

    def toJSON(self):
        return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True, indent=4)


class MyEncoder(json.JSONEncoder):
    def default(self, o):
        return o.__dict__