当前位置: 首页 > 面试题库 >

在Node.js中反序列化之后,将对象与其类重新关联

柳韬
2023-03-14
问题内容

我正在为一些特定于应用程序的对象编写一个简单的序列化/反序列化框架。

考虑以下:

"use strict";
function Dog(name) { this._name = name; };
Dog.prototype.constructor = Dog;
Dog.prototype.getName = function() { return this._name; }

var d1 = new Dog('fido');
var d2 = JSON.parse(JSON.stringify(d1));  // serialize / deserialize

> d1
Dog { _name: 'fido' }
> d1.getName()
'fido'
> d2
{ _name: 'fido' }
> d2.getName()
TypeError: d2.getName is not a function

在这一点上,我们可以问“这是什么d1d2没有?”

一种可行的方法是手动将d1的方法分配给d2:

> d2.constructor = d1.constructor
> d2.getName = d1.getName
> d2.getName()
'fido'

这有两个缺点。首先,我必须手动将d1的每个方法分配给d2。其次,d2获得了自己的属性,并且不使用原型机制共享插槽:

> d2
Dog {
   _name: 'fido',
  constructor: [Function: Dog],
  getName: [Function] }

因此,我提出的问题是:给定一个对象(例如d2),是否可以将其与另一个对象(例如d1)的原型关联,以便它继承相同的行为?


问题答案:

Object.create()并且Object.getOwnPropertyDescriptors()是你所需要的。

const obj = JSON.parse(JSON.stringify(d1))
const d3 = Object.create(Dog.prototype, Object.getOwnPropertyDescriptors(obj))

此方法与OP方法之间的区别在于,此方法prototype原型上设置属性,而OP方法直接在对象上设置属性。当您使用带有hasOwnProperty()方法的for-
in循环遍历对象自身的属性时,可以看到以下内容:

for (const i in d1) {
  if (d3.hasOwnProperty(i)) {
    console.log(i)
  }
}

在我的方法中,它仅输出_name,而在OP的方法中,它也输出getName

不幸的是,它Object.getOwnPropertyDescriptors()是ECMAScript
2017的一部分,目前仅在Firefox中受支持,因此您需要使用Babel。

或者,您可以使用Object.setPrototypeOf()。它具有比更好的浏览器支持Object.getOwnPropertyDescriptors(),但是MDN不推荐使用它,因为它速度慢。

const d3 = JSON.parse(JSON.stringify(d1))
Object.setPrototypeOf(d3, Dog.prototype)


 类似资料:
  • 有一个类实现,但在第一个版本中没有定义。在下一个版本中,我提供了。 现在的问题是,每当我试图反序列化之前存储的对象时,都会出现错误: 静态最终长serialVersionUID=4061053075992556495L;但需要com.example.android.user:静态final long serialVersionUID=-1079331593441085712L;

  • 本文向大家介绍Java中对象序列化与反序列化详解,包括了Java中对象序列化与反序列化详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java中对象序列化与反序列化。分享给大家供大家参考。具体如下: 一、简介 对象序列化(Serializable)是指将对象转换为字节序列的过程,而反序列化则是根据字节序列恢复对象的过程。 序列化一般用于以下场景: 1.永久性保存对象,保存对象的字节序列

  • 我想序列化一些XML。我的代码运行正常,但序列化不成功,对象为空,而不是填充数据。该值只是类型值:{OrangeCdToCollectorz.OrangeCd}。我怀疑我的阶级定义。以下是我正在序列化的类: 这是我的代码,尝试使用几种众所周知的技术对相同的XML进行反序列化,无论是作为字符串const还是来自文件: 以下是源XML的示例

  • 我有一个简单的JSON语句,类型非常适合需要。像这样 或 我使用POJO类映射这个json字符串和pojo类代码是给bleow 我正在使用jaxb和jakson。我正在实现webservice来处理json语句,所以我使用bean类来映射json。但是当我使用映射这个json时,它会给出以下异常 org.codehaus.jackson.map.JsonMappingExcture:名称为"mbo

  • 问题内容: 我在使用AJAX访问的Java服务器应用程序中有一个字符串。它看起来像以下内容: 当从服务器提取字符串时,是否有一种简单的方法可以将其转换为活动的JavaScript对象(或数组)?还是我必须手动拆分字符串并手动构建对象? 问题答案: 现代浏览器支持。 在不浏览器,您可以包括在库中。

  • 问题内容: 如何将json格式的数据字符串转换为 匿名对象 ? 问题答案: C#4.0添加了可以使用的动态对象。看看这个。