diff --git a/src/lua/bsdsocket.lua b/src/lua/bsdsocket.lua
index a86e14bad85a8886f621bcc967249b3c4db25dbd..871bdbd356a6fdf65f1d67199b3681c9b0a3dffc 100644
--- a/src/lua/bsdsocket.lua
+++ b/src/lua/bsdsocket.lua
@@ -205,6 +205,7 @@ socket_methods.nonblock = function(self, nb)
     end
 end
 
+local waiters_mt = { __serialize = 'mapping' }
 local function wait_safely(self, what, timeout)
     local fd = check_socket(self)
     local f = fiber.self()
@@ -214,7 +215,7 @@ local function wait_safely(self, what, timeout)
     timeout = timeout or TIMEOUT_INFINITY
 
     if self.waiters == nil then
-        self.waiters = {}
+        self.waiters = setmetatable({}, waiters_mt)
     end
 
     self.waiters[fid] = true
@@ -1072,6 +1073,11 @@ socket_mt   = {
         end
         self._errno = save_errno
         return name
+    end,
+    __serialize = function(self)
+        -- Allow YAML, MsgPack and JSON to dump objects with sockets
+        local fd = check_socket(self)
+        return { fd = fd, peer = self:peer(), name = self:name() }
     end
 }
 
diff --git a/test/box/bsdsocket.result b/test/box/bsdsocket.result
index c803cb769e4a245c8ed807e44cab187dd78a1f45..ccc0973dea38030d9b48b65242cb2c55859ef2ea 100644
--- a/test/box/bsdsocket.result
+++ b/test/box/bsdsocket.result
@@ -1,6 +1,9 @@
 json = require 'json'
 ---
 ...
+yaml = require 'yaml'
+---
+...
 pickle = require 'pickle'
 ---
 ...
@@ -265,7 +268,7 @@ s:getsockopt('SOL_SOCKET', 'SO_DEBUG')
 ...
 s:setsockopt('SOL_SOCKET', 'SO_ACCEPTCONN', 1)
 ---
-- error: 'builtin/socket.lua:340: Socket option SO_ACCEPTCONN is read only'
+- error: 'builtin/socket.lua:341: Socket option SO_ACCEPTCONN is read only'
 ...
 s:getsockopt('SOL_SOCKET', 'SO_RCVBUF') > 32
 ---
@@ -1312,3 +1315,27 @@ os.remove(path)
 ---
 - true
 ...
+-- Test serializers with sockets
+s = socket('AF_UNIX', 'SOCK_STREAM', 'ip')
+---
+...
+x = s:wait()
+---
+...
+-- waiters is map
+s.waiters
+---
+- {}
+...
+-- check __serialize hook
+json.decode(json.encode(s)).fd == s:fd()
+---
+- true
+...
+yaml.decode(yaml.encode(s)).fd == s:fd()
+---
+- true
+...
+s = nil
+---
+...
diff --git a/test/box/bsdsocket.test.lua b/test/box/bsdsocket.test.lua
index 23d527bfbcc2ed26e29c98f58fb4a62bda60ce6c..7ead95599262bb1498d51354ba5cd88928b7ed1b 100644
--- a/test/box/bsdsocket.test.lua
+++ b/test/box/bsdsocket.test.lua
@@ -1,4 +1,5 @@
 json = require 'json'
+yaml = require 'yaml'
 pickle = require 'pickle'
 socket = require 'socket'
 fiber = require 'fiber'
@@ -445,3 +446,13 @@ collectgarbage('collect')
 collectgarbage('collect')
 socket.tcp_connect('unix/', path), errno() == errno.ECONNREFUSED
 os.remove(path)
+
+-- Test serializers with sockets
+s = socket('AF_UNIX', 'SOCK_STREAM', 'ip')
+x = s:wait()
+-- waiters is map
+s.waiters
+-- check __serialize hook
+json.decode(json.encode(s)).fd == s:fd()
+yaml.decode(yaml.encode(s)).fd == s:fd()
+s = nil