我有一个Electron应用程序,它通过IPC(使用Electron内置的ipcRenderer.send()
)将文件元数据作为对象从Main进程发送到Renderer进程。
我的问题是,发送此元数据时,有一个Set
对象的属性变成了空白对象。在我的文件元数据的toJSON()
方法中,它将Set
转换为数组,如下所示:
toJSON() {
let copy = Object.assign({}, this);
copy.tags = Array.from(copy.tags);
return copy;
}
在调试器中逐步执行主进程和渲染器进程时,Electron似乎从未调用过toJSON()
方法(尽管在其他地方对元数据对象进行序列化时会调用它)。
我假设Set
在序列化期间成为空白对象,但是为什么Electron在通过IPC发送数据之前不调用toJSON()
?以及如何正确转换对象?
编辑:让我提供更好的解释和示例。见下文
这是前端渲染器过程中调用的函数:
function getFile(...args) {
return new Promise((resolve, reject) => {
let result = ipcRenderer.sendSync('getFile', ...args);
resolve(result);
});
}
以下是主进程中响应该消息的代码:
ipcMain.on('getFile', async (event, ...args) => {
let result = await myGetFileFunc(...args); // myGetFileFunc returns an instance of File()
event.returnValue = result || false;
});
这里是File
类,其中myGetFileFunc
返回以下实例:
class File() }
constructor() {
this.tags = new Set();
}
getTags() {
return this.tags;
}
setTags(tags) {
this.tags = tags;
}
prepareForJSON() {
let copy = Object.assign({}, this);
copy.tags = Array.from(copy.tags);
return copy;
}
}
最后,这是Tag
类:
class Tag {
constructor(id, name) {
this.id = id;
this.name = name;
}
toJSON() {
return {
id: this.id,
name: this.name
};
}
总而言之,渲染器进程调用ipcRenderer.send()
,主进程以文件对象作为响应,其中包括Set
个Tag
,但是在渲染器中接收到文件对象后过程中,其中包含Set
的{{1}}成为一个空对象Tag
。