2

我已经扩展了Stringruby​​ 中的类,使其具有与其所有实例相关联的时间戳 id。这是它目前的样子:

 class String
        attr_accessor :id

        def get_timestamp
            @id ||= Time.now.nsec.to_i
            return @id
        end 
 end

我正在通过网络序列化这个字符串,但是一旦在网络的另一端接收到字符串对象,它们的 ID 就会丢失。我想知道如何序列化和反序列化字符串,以便保留关联的 id。

4

1 回答 1

1

像这样的 Monkeypatching Ruby 类通常被认为是不好的做法。您可能想要生成一个单独的类。

为了使socket.write "#{message}\r\n"调用包含更多信息,您需要覆盖to_son String。不过要小心!这几乎肯定会破坏事情,因为该方法通常在很多地方被调用。

我不知道你在代码中使用它的目的是什么,所以你应该选择一个更好的名字,但你可以这样做:

class StringWithID
  attr_reader :id, :string

  def self.from_network(bytes)
    id, string = bytes.unpack("Qm0")
    new(id, string)
  end

  def initialize(id = nil, string)
    @id = id || Time.now.nsec.to_i
    @string = string
  end

  def to_s
    @string
  end
  alias :to_s :to_str

  def to_network
    [@id, @string].pack("Qm0")
  end
end

然后你可以这样称呼它:

str = StringWithID.new("some string")
socket.write "#{str.to_network}\r\n"

然后在网络的另一端:

str = StringWithID.from_network(socket.gets)
于 2013-07-17T20:46:42.987 回答