javascript:发布到api时序列化/反序列化类实例

时间:2018-11-23 20:32:28

标签: javascript node.js

基本上,我希望能够将序列化的类实例(JS前端)发布到端点,并在另一端(nodejs后端)反序列化。 由于我都在使用JS,因此似乎应该可以使用相同的类def进行序列化/反序列化,并在后端使用相同类的实例。

这样,如果class def发生变化,则前端和后端将保持同步。

请有人帮忙一些可能对工作有益的方法/库-或如果以上听起来很疯狂,请告诉我!

2 个答案:

答案 0 :(得分:0)

当对象具有toJSON()方法时,您可以定义需要JSON.stringify()进行序列化的内容

然后只需设置构造函数和toJSON()方法就输入/输出兼容即可,您可以来回发送json

class Foo {
  constructor(state) {
    const defState = {foo: 'bar'}
    this.state = state ? Object.assign(defState, state) : defState;
  }
  
  get person(){
    return this.state.person
  }

  toJSON() {
    return this.state
  }
}

// local instance
const localInstance = new Foo({person:'Bob'});
const localJSON = JSON.stringify(localInstance);
console.log('Local class name : ',localInstance.constructor.name) 
console.log('LocalJSON', localJSON)


// remote instance from local JSON
const remoteInstance = new Foo(JSON.parse(localJSON))
console.log('Remote instance person : ', remoteInstance.person)

答案 1 :(得分:0)

我制作了一个名为 esserializer 的 npm 模块来解决这个问题:在序列化期间以纯 JSON 格式保存 JavaScript 类实例值及其类名信息。然后可以将序列化的文本发布到端点:

// Browser side
const ESSerializer = require('esserializer');
const serializedText = ESSerializer.serialize(anInstanceOfClassX);
// Send Ajax POST request, with serializedText as data

稍后,在Nodejs服务器的反序列化阶段,esserializer可以递归反序列化对象实例,保留所有类型/函数信息,使用相同的类定义:

// Node.js side
const deserializedObj = ESSerializer.deserialize(serializedText, [ClassX]);
// deserializedObj is a perfect copy of anInstanceOfClassX

如果类定义发生变化,前端和后端将自动同步。