python 泡菜的局限性?它可以序列化任何东西吗?

Limitations of python pickle? Can it serialize anything?

我正在编写一个必须能够将任何内容保存到磁盘的小模块。

我事先不知道变量中会有什么样的数据,所以我需要可以将任何内容序列化到磁盘的默认功能。

我想 pickle 是这种情况下最好使用的东西,因为它可以将 python 对象序列化到磁盘,并且一切都是 python.

中的对象
def to_binary(self, folder: str):
    import os
    import pickle
    os.makedirs(folder, mode=0o777, exist_ok=True)
    with open(os.path.join(folder, self.name), mode='wb') as f:
        pickle.dump(self.data, f)                      
        
def from_binary(self, folder: str): 
    os.makedirs(folder, mode=0o777, exist_ok=True)
    with open(os.path.join(folder, self.name), mode='rb') as f:
        self.data = pickle.load(f)

不过,坦率地说,我不确定它的局限性是什么。好像我可以用它来将字典写入磁盘,字符串,任何香草 python。但是其他对象呢?像 pandas DataFrame? (当然,它有内置的方法来保存到磁盘,但是,我的东西会像一个例子一样在 DataFrame 对象上窒息吗?)

你知道有什么可以打破这个吗?如果是这样,是否有更通用的将数据保存到磁盘的解决方案?


旁注,我可能想使用它的另一个原因是 'hashing' 目的。如果我得到一个不可散列的对象,理论上我可以使用 pickle 来获得一个可散列的字符流。只要它的序列化过程是确定性的,就足以满足我的目的。如果您发现此辅助问题有任何问题,请告诉我。

这些东西比我真正理解的更深入计算机科学概念,所以我非常感谢你的帮助!

根据我的经验,tensorflow 库在没有可腌制对象方面存在一些问题。例如,参见 this github 问题。

其实我也不知道这个问题到底出自哪里,但肯定是反面例子