自定义类如何实现序列化?

自定义类如何实现序列化

阅读 729
avatarAI BotBETA

在Python中,可以通过定义一个类的__init____str__方法来实现序列化。其中,__init__方法用于初始化对象的状态,__str__方法用于返回一个字符串表示,这个字符串可以被用来重新创建对象。

下面是一个简单的例子:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f'Person(name={self.name}, age={self.age})'

# 序列化
person = Person('Alice', 30)
serialized_person = str(person)  # 序列化成字符串
print(serialized_person)  # 输出:Person(name=Alice, age=30)

# 反序列化
deserialized_person = eval(serialized_person)  # 反序列化成对象
print(deserialized_person.name)  # 输出:Alice
print(deserialized_person.age)  # 输出:30

需要注意的是,eval函数具有一定的安全风险,因为它会执行传入的字符串作为代码。在实际应用中,应该使用更安全的方法来反序列化对象,例如使用pickle模块。

另外,自定义类的序列化还需要考虑一些特殊情况,例如循环引用、不可序列化的属性等。对于这些情况,需要使用一些额外的技术来处理。

1 个回答

可以参考序列化方法:implements rpc.Parcelable。

示例代码如下:

import rpc from '@ohos.rpc'; 
import hilog from '@ohos.hilog'; 
import UIAbility from '@ohos.app.ability.UIAbility'; 
import AbilityConstant from '@ohos.app.ability.AbilityConstant'; 
 
class MyParcelable implements rpc.Parcelable { 
  num: number = 0; 
  str: string = ''; 
 
  constructor(num: number, str: string) { 
    this.num = num; 
    this.str = str; 
  } 
 
  marshalling(messageSequence: rpc.MessageSequence): boolean { 
    messageSequence.writeInt(this.num); 
    messageSequence.writeString(this.str); 
    return true; 
  } 
 
  unmarshalling(messageSequence: rpc.MessageSequence): boolean { 
    this.num = messageSequence.readInt(); 
    this.str = messageSequence.readString(); 
    return true; 
  } 
} 
 
let parcelable = new MyParcelable(1, "aaa"); 
let data = rpc.MessageSequence.create(); 
let result = data.writeParcelable(parcelable); 
hilog.info(0x0000, 'testTag', 'RpcClient: writeParcelable is ' + result); 
let ret = new MyParcelable(0, ""); 
let result2 = data.readParcelable(ret); 
hilog.info(0x0000, 'testTag', 'RpcClient: readParcelable is ' + result2); 
 
class MyUIAbility extends UIAbility { 
  onMemoryLevel(level: AbilityConstant.MemoryLevel) { 
    console.log(`onMemoryLevel, level: ${JSON.stringify(level)}`); 
  } 
}

详细可以参考文档:Parcelable

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进