Serialized常用方法,不积硅步无以至千里

本文介绍如何使用C#实现对象的序列化与反序列化操作,包括添加[Serializable]标记使类可被序列化、使用[NonSerialized]排除特定字段、创建并操作文件流、利用BinaryFormatter进行序列化及反序列化等步骤。

1. 将类的上方加上[Serializable],定义为可被序列化的

2. 将不想序列化的字段,上方加上[NonSerialized]

3. 创建文件流:FileStream fileStream=new FileStream(序列化后保存在该全路径下,文件的操作模式,文件的读写权限);

4. 创建BinaryFormatter对象:BinaryFormatter binaryFormatter=new BinaryFormatter();

5. 序列化:binaryFormatter.Serialize(fileStream,待序列化的对象)

6. 反序列化:

      设定文件读取位置:fileStream.Seek(相对于基准位置的偏移字节数,基准位置);

      获得对象:(反序列化出来的对象类型)binaryFormatter.Deserialize(fileStream);

 

### Python 中常用的反序列化魔术方法 在Python中,某些特定的魔术方法可以在对象被反序列化的过程中自动调用。这些方法允许开发者控制反序列化的行为,并可能引入安全风险,特别是当输入可信时。 #### `__setstate__` 方法方法用于自定义如何设置实例的状态。当通过像pickle这样的库加载对象时会调用这个方法[^5]。默认情况下,它接收一个字典并更新实例的`__dict__`属性来恢复状态。然而,程序员可以通过重载此方法来自定义更复杂的状态恢复逻辑。 ```python import pickle class Example: def __init__(self, value): self.value = value def __setstate__(self, state): # 自定义反序列化后的处理方式 print("Customizing the deserialization process.") self.__dict__.update(state) example = Example(10) data = pickle.dumps(example) loaded_example = pickle.loads(data) ``` #### `__getnewargs_ex__` 和 `__getnewargs__` 方法 这两个方法决定了创建新实例所需的参数列表。它们通常一起工作以确保兼容性和灵活性。前者返回两个元素组成的元组:一个是位置参数的元组;另一个是关键字参数的字典。后者仅返回位置参数的元组。如果两者都存在,则优先使用`__getnewargs_ex__`。 ```python from dataclasses import dataclass @dataclass(frozen=True) class Point: x: float y: float def __getnewargs_ex__(self): return ((self.x,), {'y': self.y}) point = Point(3.0, 4.0) serialized_point = pickle.dumps(point) deserialized_point = pickle.loads(serialized_point) print(deserialized_point) # Output should be Point(x=3.0, y=4.0) ``` #### `__reduce__` 方法 这是最强大的反序列化钩子之一。它可以指定一系列操作以便重新构建对象。具体来说,它可以返回一个可调用对象以及它的参数(作为元组),甚至还可以附加额外的信息比如状态初始化器和迭代器等。由于这种能力,当实现可能会带来严重的安全隐患。 ```python import os class DangerousClass: def __reduce__(self): return (os.system, ('echo "This is a dangerous command"',)) dangerous_instance = DangerousClass() pickled_data = pickle.dumps(dangerous_instance) unpickled_object = pickle.loads(pickled_data) # This will execute 'echo' command on your system. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值