2010-11-30 8 views
5

Necesito definir métodos personalizados para serializar/deserializar un objeto. Quiero hacer algo como lo siguiente.Personalizado to_yaml y domain_type

class Person 
    def to_yaml_type 
    "!example.com,2010-11-30/Person" 
    end 

    def to_yaml 
    "string representing person" 
    end 

    def from_yaml(yaml) 
    Person.load_from(yaml) 
    end 
end 

¿Cuál es la forma correcta de declarar la serialización/deserialización?

Respuesta

5

bien, esto es lo que ocurrió con

class Person 

    def to_yaml_type 
    "!example.com,2010-11-30/person" 
    end 

    def to_yaml(opts = {}) 
    YAML.quick_emit(nil, opts) { |out| 
     out.scalar(taguri, to_string_representation, :plain) 
    } 
    end 

    def to_string_representation 
    ... 
    end 

    def Person.from_string_representation(string_representation) 
    ... # returns a Person 
    end 
end 

YAML::add_domain_type("example.com,2010-11-30", "person") do |type, val| 
    Person.from_string_representation(val) 
end 
4

Si lo que desea es serializar sólo un subconjunto de propiedades, no todos ellos, es posible que desee utilizar to_yaml_properties.

+1

Como nota, esta debería ser una lista de nombres de variables de instancia como '% w [@foo @bar]' – tadman

Cuestiones relacionadas