diff --git a/lib/numruby/nmatrix.rb b/lib/numruby/nmatrix.rb index 8172f61..9575bba 100644 --- a/lib/numruby/nmatrix.rb +++ b/lib/numruby/nmatrix.rb @@ -89,6 +89,46 @@ def to_a return self.elements end + def _dump data + [ + self.dim, + self.dtype, + self.stype, + self.shape, + self.elements, + ].join(":") + end + + def self._load serial + data = serial.split(":") + dim = data[0].to_i + dtype = data[1].to_sym + stype = data[2].to_sym + shape = data[3..(3+dim-1)] + elements = data[(3+dim)..data.length-1] + parsed_elements = [] + + if dtype == :nm_bool + elements.each do |e| + parsed_elements.push(e == "true" ? true : false) + end + elsif dtype == :nm_float64 + elements.each do |e| + parsed_elements.push(e.to_f) + end + else + # Convert to Integer + elements.each do |e| + parsed_elements.push(e.to_i) + end + end + parsed_shape = [] + shape.each do |e| + parsed_shape.push(e.to_i) + end + self.new(parsed_shape, parsed_elements, dtype) + end + def inspect #:nodoc: original_inspect = super() original_inspect = original_inspect[0...original_inspect.size-1] diff --git a/test/nmatrix_test.rb b/test/nmatrix_test.rb index 1281d3f..14ea6f0 100644 --- a/test/nmatrix_test.rb +++ b/test/nmatrix_test.rb @@ -60,4 +60,16 @@ def test_slicing assert_equal @m_int[0, 0..1, 0..1], @s_int end + def test_serializing + serialized_data_float = Marshal.dump(@m) + deserialized_data_float = Marshal.load(serialized_data_float) + serialized_data_int = Marshal.dump(@m_int) + deserialized_data_int = Marshal.load(serialized_data_int) + serialized_data_bool = Marshal.dump(@b) + deserialized_data_bool = Marshal.load(serialized_data_bool) + assert_equal @m, deserialized_data_float + assert_equal @m_int, deserialized_data_int + assert_equal @b, deserialized_data_bool + end + end