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

Sending a list of custom objects from server to client

我在同一个js文件中做了一个Characterclass客户端和服务器共享

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

我该如何解决这个问题?

您不能使用 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
});
socket.emit( 'updated_characters', JSON.stringify(characterList) );

我们必须做 JSON.stringify 以便套接字识别为 JSON 并在前端显示它