Ruby Marshal.dump对于看起来相同的东西给出了不同的结果

Ruby Marshal.dump对于看起来相同的东西给出了不同的结果,ruby,serialization,marshalling,Ruby,Serialization,Marshalling,我看到Ruby的Marshal.dump的结果略有不同,这取决于我是调用了.to\s还是键入了字符。我真的不清楚这里发生了什么: » Marshal.dump(1.to_s) => "\x04\bI\"\x061\x06:\x06EF" » Marshal.dump('1') => "\x04\bI\"\x061\x06:\x06ET" » 1.to_s == '1' => true 因此,尽管看起来1.to_s==“1”,但它们并没有转储到同一个对象,但唯一的区别在于

我看到Ruby的
Marshal.dump的结果略有不同,这取决于我是调用了
.to\s
还是键入了字符。我真的不清楚这里发生了什么:

»  Marshal.dump(1.to_s)
=> "\x04\bI\"\x061\x06:\x06EF"
»  Marshal.dump('1')
=> "\x04\bI\"\x061\x06:\x06ET"
»  1.to_s == '1'
=> true
因此,尽管看起来
1.to_s==“1”
,但它们并没有转储到同一个对象,但唯一的区别在于最后一个字节。你知道为什么会发生这种情况,以及如何将这两个东西转储到同一个字节序列吗

Marshal.load("\x04\bI\"\x061\x06:\x06EF").encoding
# => #<Encoding:US-ASCII> 
Marshal.load("\x04\bI\"\x061\x06:\x06ET").encoding
# => #<Encoding:UTF-8>
(假设您在较新的Ruby上运行它,并且不干扰源代码编码。)

Marshal.dump(1.to_s.force_encoding('utf-8'))
# => "\x04\bI\"\x061\x06:\x06ET"
Marshal.dump('1')
# => "\x04\bI\"\x061\x06:\x06ET"