从服务器到客户端发送自定义对象列表

时间:2015-08-26 15:39:37

标签: javascript node.js socket.io

我在同一个js文件中由客户端和服务器共享了一个Character类。

服务器实例化这些字符并将它们存储在characterList对象中。我使用socket.emit( 'updated_characters', characterList )将其发送给客户,但是客户端返回Object的对象,而不是Character的对象,因此我无法使用我的角色&#39对他们的方法。

我怎样才能解决这个问题?

2 个答案:

答案 0 :(得分:4)

您无法使用socket.io直接发送自定义对象类型。 socket.io使用JSON作为对象的传输格式,JSON无法记录或重建自定义对象类型。

因此,您需要做的是为对象创建一个序列化格式(也可能是JSON),然后当您在另一端读取数据时,您将在自己的代码中构造一个自定义对象,然后将它在构造函数中传递给它,它将从中初始化它。

执行此操作的规范方法是为自定义对象创建一个序列化方法,该方法创建一个新的普通对象,其中包含需要通过网络发送的所有相关信息,并且不包含对其他对象的引用(因为无法序列化)。请记住,对象通常具有不一定需要发送到另一端的内务处理信息。然后,为自定义对象创建一个初始化方法,该方法可以获取此序列化数据并正确初始化您可以在另一端使用的对象。

这是一个简单的例子:

function MyObject(data) {
   if (data) {
      this.init(data);
   } else {
       this.count = 0;
       this.greeting = "hello"
   }
}

MyObject.prototype = {
    init: function(data) {
       this.greeting = data.greeting;
       this.count = data.count;
    },
    getData: function() {
        return {greeting: this.greeting, count: this.count};
    },
    talk: function() {
        say(this.greeting);
    }
};

然后,在发送端,如果您在item中有对象的实例,则会发送数据:

socket.emit('updated_characters', item.getData());

而且,在接收方面,你会有这个:

socket.on('updated_characters', function(data) {
    var item = new MyObject(data);
    // do something with the item here
});

答案 1 :(得分:1)

socket.emit( 'updated_characters', JSON.stringify(characterList) );

我们必须JSON.stringify才能将套接字标识为JSON并在前端显示