【问题标题】:Sending an object to another server without converting to JSON将对象发送到另一台服务器而不转换为 JSON
【发布时间】:2018-04-15 11:44:46
【问题描述】:

比方说,我有一个这样的课程:

var block = class {
    constructor(val1, val2) {
        this.value1 = val1;
        this.value2 = val2;
    }
}

我想将此类的一个实例从一台服务器发送到另一台服务器。我通常会先通过JSON.stringify(),然后将其发送到另一台服务器,然后再通过JSON.parse(),一旦它到达另一台服务器。但是,这将涉及将其转换为 JSON,并且它将不再是“块”类的实例。

如果我想以一种将其保留为“块”类的实例的方式发送它,那么最佳实践是什么。

【问题讨论】:

  • 你不能发送对象,你需要做的是在另一边创建类,你可以使用Object.assign重新复制回道具
  • 与发送数据相比,这里仍然没有开销,..这里的微优化,而不是易于阅读的代码是在浪费你的时间。如果在服务器端重新序列化为相同的对象类有意义,请执行此操作。
  • @DanielPahor 好吧,正如其他人所提到的。一个小信息,HTTP 仅适用于字符串表示。您必须编写一个映射器来从字符串中创建对象,就像 Jackson 在 JAVA 中所做的那样。顺便说一句,它在 Javascript 服务器上应该相当容易,因为它们支持开箱即用的 JSON
  • 看看Casting plain objects to function instances (“classes”) in javascript。传输由带有代码和闭包以及身份引用的函数组成的类既困难又低效。

标签: javascript ecmascript-6


【解决方案1】:

您在这里要求的是一种 RPC(远程过程调用)。

我认为你这样做是正确的,这样当你在服务器端反序列化对象时,你可以重用你在客户端使用的类。

使用您的示例类块,我在这里添加了一个名为 display 的方法。这里的方便之处在于,在发送 JSON 后,显示将在两台服务器上工作。

显然,在 SO sn-p 中,显示服务器到服务器的通信有点尴尬,但我所做的是保存到一个字符串,然后从字符串重新生成相同的类,这正是你会做的一些 RPC。

您当然可以扩展它,以便发送类名,并用于重新生成对象,以便它可以发送多种类型的 RPC 命令。

var block = class {
    constructor(val1, val2) {
        this.value1 = val1;
        this.value2 = val2;
    }
    display() {
      console.log(this.value1, this.value2);
    }
}

var b1 = new block(1,2);

b1.display();

//lets pretend our stream is what gets sent over network
var stream = JSON.stringify(b1);

var b2 = new block();
Object.assign(b2, JSON.parse(stream));

b2.display();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2018-02-05
    • 2012-06-07
    相关资源
    最近更新 更多