Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Already on GitHub? Sign in to your account

Supporting serialization of arbitrary objects #10

Open
wants to merge 1 commit into
from

Conversation

Projects
None yet
2 participants

bendiken commented Oct 1, 2010

I've implemented a super-simple (just one line of code) yet significant improvement in my fork:

http://github.com/bendiken/bert/commit/bc48200fda886f560d8611559f0233a280bb8faa

This makes BERT.encode rather more useful by allowing it to serialize any Ruby object as long as that object responds to the #to_bert method, which should return the BERT representation of the object.

This is a feature we very much need for RDF::BERT. With this patch, it now becomes possible to do things like the following:

require 'rdf'
require 'bert'

class RDF::Literal
  def to_bert
    BERT::Tuple[:literal, value.to_s, {:language => language.to_sym}]
  end
end

p BERT.encode(RDF::Literal("Hello!", :language => :en))

Much appreciated if this could be merged, it's a pretty trivial and non-invasive change but opens the door to new use cases such as the above.

@bendiken bendiken Implemented #to_bert support in the BERT encoder.
With this minor change, objects of other types than just Symbol, Integer, Float, Tuple, Array, or String can be serialized as long as they provide a #to_bert method that returns the BERT representation of the object.
bc48200

While waiting for this to be merged, here's a monkey-patch on top of 1.1.2 for anyone who needs this functionality right now:

##
# Extensions for the BERT encoder.
#
# @see http://github.com/mojombo/bert/pull/10
class BERT::Encode
  alias_method :write_any_raw_without_to_bert, :write_any_raw
  def write_any_raw(obj)
    obj = obj.to_bert if obj.respond_to?(:to_bert)
    write_any_raw_without_to_bert(obj)
  end
end
Contributor

schmurfy commented Jan 9, 2011

I hope this ends up being merged as it is the first thing i tried to do with this library :p
Is there any reason/choice preventing it from being merged ?
I will go with the monkey patch for now, thanks for providing it.

bendiken commented Jan 9, 2011

@schmurfy, it appears to me that BERT is simply no longer actively maintained. We are therefore reconsidering other options such as Avro and MsgPack. I'll keep this pull request active for now given that the monkey-patch may be useful to others, but am not really expecting it to get merged anytime soon...

Contributor

schmurfy commented Jan 9, 2011

@beniken, thanks for your answer, I did not checked the last commit date but I thinks it has more to do with the fact that the library is stable and does not require a lot of attention.

I improved a little your monkey patch, it may be of some use to someone else, the problem was that the result from to_bert was not passed through the convert method and thus did not work at all for me (I just used your approach but one level higher):

class BERT::Encoder
  class << self
    alias_method :convert_without_to_bert, :convert

    def convert(obj)
      obj = obj.to_bert if obj.respond_to?(:to_bert)
      convert_without_to_bert(obj)
    end
  end
end

Bump? Could this be merged?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment