Search code examples
torch

Serialization fails with custom Torch class


Serialization can fails with a class object created containing __pairs:

test = torch.class('test')
function test:__init()
  self.data = {}
end

function test:__pairs(...)
    return pairs(self.data, ...)
end

function test:get_data()
  print(self.data)
end

a = test.new()
a.data = {"asdasd"}
b = torch.serialize(a)
c = torch.deserialize(b)
print(torch.typename(c))
print(c:get_data())

The following returns:

test
nil

Solution

  • The engine behind the torch.serialization is located in the File-class. The File:writeObject us the key function. For the above example the action for a Torch class starts at line 201 with the:

    elseif typeidx == TYPE_TORCH then
    

    The type is identified in the File:isWritableObject.

    One could probably implement the metatable function write but in the above example the problem was non-torch metatable function __pairs that should be __pairs__ (see torch.getmetatable):

    test = torch.class('test')
    function test:__init()
      self.data = {}
    end
    
    function test:__pairs__(...)
        return pairs(self.data, ...)
    end
    
    function test:get_data()
      print(self.data)
    end
    
    a = test.new()
    a.data = {"asdasd"}
    b = torch.serialize(a)
    c = torch.deserialize(b)
    print(torch.typename(c))
    print(c:get_data())
    

    This gives the expected:

    test    
    {
      1 : "asdasd"
    }