如何将任何对象转换为字节数组并将其保留在内存中?

6
我正在尝试在Python中构建一个简单的将任何对象转换为字节数组的转换器。我查看了 pickle,但它只能创建文件,这不是我需要的。我还查看了json.dump,但某些对象需要序列化才能转储。
我需要一个在内存中保留我的对象并可以将任何对象转换为字节数组的转换器。

你看过bytearray函数吗? - Abion47
任何任意类型,不需要提问?不,我认为这是不可能的,除非进行一些严肃的反思工作,即使如此,这也可能比它的价值更有争议。如果您想序列化一个类型(特别是自定义类型),通常必须定义它如何可以被序列化(例如通过符合缓冲区接口来使用bytearray进行序列化)。 - Abion47
1
谈到pickle,你觉得它只能通过写入文件来工作吗?你试过使用dumps函数吗? - Abion47
嗯,也许这可以帮到我,我会尝试实现它,但老实说我真的在寻找一个任何类型到字节数组转换器,就像你提到的那样。这很悲惨,因为我们可以在其他语言中轻松地做到这一点 :( 但还是谢谢你。 - R. Karlus
1
@R.Karlus,您可以使用pickle.dumps,但是为什么需要将其转换为bytes?目的是什么? - juanpa.arrivillaga
显示剩余5条评论
2个回答

20

我将这作为一个实际答案添加,因为它似乎解决了你的问题。问题在于你使用了 pickle.dump ,它的设计是将序列化后的对象写入文件(虽然正如其他答案中指出的那样,它不一定必须这样做,但这已经无关紧要了)。

你需要使用的函数是pickle.dumps,它直接将序列化后的对象作为字节数组返回:

someobject = 123
someobject_bytes = pickle.dumps(someobject)

1
太棒了!太好了!点赞。 - NotDijkstra
使用pickle.loads(someobject_bytes)来反序列化字节。 - Hi computer

1
Picklerfile参数只需要有一个接收字节的write(b)方法。原则上,您可以编写自己的类,其中包含您想要执行的write(self, b)方法,并将该类的对象传递给Pickler

示例:

import pickle

class File:
  def write(self,b):
    print(b)

f = File()
p = pickle.Pickler(f)

object = 3.14
p.dump(object)

输出:b'\x80\x03G@\t\x1e\xb8Q\xeb\x85\x1f.'

与此示例中打印字节不同,您可以将它们附加到list或任何其他您想要的地方。


2
这是很多工作,为了让“dump”工作,你可以直接使用“dumps”。 - Abion47
我使用pickle dumps方法解决了这个问题。但是在这里,我为你的帮助点赞。 - R. Karlus
@Abion47 这不是为了让“dump”工作,而是展示它在使用时不一定要是一个文件。以返回值或回调函数的形式传递值有各自适用的情况,其中一种比另一种更可取。 - NotDijkstra
当然,您可以使用dump来处理不是文件对象的内容。但是,您必须定义一个符合特定接口的自定义类,该接口定义了一个函数,该函数将字节作为参数接收。或者...您可以跳过所有这些步骤,直接使用dumps获取字节。您的回答是一个有趣的小知识点,但我无法想象在实际情况下它会成为OP的有用替代方案。 - Abion47
这种方法如何解决无法将整个序列化对象放入内存的问题?你仍然需要将整个字节数组传递给参数。是的,有时回调函数比简单返回更有用(尽管你提供的示例非常牵强),但这与OP的问题无关。 - Abion47
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接