File io 如何将对象读/写到文件?

File io 如何将对象读/写到文件?,file-io,smalltalk,squeak,File Io,Smalltalk,Squeak,我想将一个对象(一个简单的集合)写入一个文件。我到处找了找,找到了。我也浏览了很多链接断开的网站,但我似乎找不到一种在smalltalk中写入文件的方法。我试过这个(和其他东西,但结果都一样): 正如链接问题中所建议的,但它似乎没有做任何事情。它不会抛出错误,但我也找不到任何文件 我想做的唯一一件事就是持久化我的对象(二进制或文本并不重要),那么我该怎么做呢 提前感谢您似乎在为扩展使用语法,而不是基本语法。 至少在Pharo中,'newFile'asFileName是一个字符串,而#writeS

我想将一个对象(一个简单的集合)写入一个文件。我到处找了找,找到了。我也浏览了很多链接断开的网站,但我似乎找不到一种在smalltalk中写入文件的方法。我试过这个(和其他东西,但结果都一样):

正如链接问题中所建议的,但它似乎没有做任何事情。它不会抛出错误,但我也找不到任何文件

我想做的唯一一件事就是持久化我的对象(二进制或文本并不重要),那么我该怎么做呢


提前感谢

您似乎在为扩展使用语法,而不是基本语法。 至少在Pharo中,
'newFile'asFileName
是一个字符串,而#writeStream在同一字符串上而不是在文件上为您提供流

尝试使用名为“newFile”的
FileStream newfilename
或类似的东西


最重要的是:当一些奇怪的事情发生时,检查一下。检查部分评估并检查所有假设。或者更好的是,调试并查看代码的去向

您所做的是在字符串上创建写入流。这实际上是可行的,但信息存储在字符串对象上,不会写入任何文件

这适用于Squeak和Pharo(可能还有其他方言):

在法罗,你可以写:

'filename.ext' asFileReference writeStreamDo: [ :stream |
    ... ].
但是请注意,有更好的方法将结构化数据存储在文件中,例如(Smalltalk对象表示法、Smalltalk版本的JSON)或XML。如果您希望持久化对象,而不是签出(可能不再支持)或任何其他对象序列化程序

最后还有ImageSegment,一个基于VM的对象序列化程序(不需要额外的包),但您可能需要一些帮助。

解决方案:

| d out | 
d := Dictionary new.
d at: 'green' put: 'vert'.
d at: 'blue' put: 'bleu'. 
d at: 'red' put: 'rouge'.
d at: 'white' put: 'blanc'.

out := FileStream fileNamed: 'dict-out.txt'.

d associationsDo: [ :assoc | out 
    nextPutAll: assoc key asString;
    nextPut: $, ;
    nextPutAll: assoc value asString; cr.].
out close.
另见:


传统的Smalltalk序列化格式使用
storeOn:
readFrom:
方法。例如

d1 := {'a'->1. 'b'->2. 'c'->'3'} as: Dictionary.

"store"
FileStream forceNewFileNamed: 'mydict.st' do: [:out | d1 storeOn: out].

"read"
d2 := FileStream oldFileNamed: 'mydict.st' do:  [:in | Object readFrom: in].

这是一种文本格式,对于较大的数据集来说效率很低。此外,它不能存储循环引用。为此,请查看其他答案中列出的更高级的序列化选项。

燃油中的等效选项为

FLSerializer serialize: d toFileNamed: 'filename.ext'.


跺脚似乎不再受支持。最新版本适用于Pharo 1.2和Squeak 4.2。谢谢。无论如何,我都会将链接保留在文档中。Fuel允许对象传输,只要定义相同(并且您可以指定迁移)。SIXX是一个很好的补充。有没有办法指定文件的路径?只需为文件名指定一个绝对路径,例如“/home/you/filename.ext”。相对路径始终相对于映像所在的目录。
d1 := {'a'->1. 'b'->2. 'c'->'3'} as: Dictionary.

"store"
FileStream forceNewFileNamed: 'mydict.st' do: [:out | d1 storeOn: out].

"read"
d2 := FileStream oldFileNamed: 'mydict.st' do:  [:in | Object readFrom: in].
FLSerializer serialize: d toFileNamed: 'filename.ext'.
d := FLMaterializer materializeFromFileNamed: 'filename.ext'