web-dev-qa-db-fra.com

Electron: Erreur: impossible de désérialiser les données clonées en raison d'une version non valide ou non prise en charge

J'ai une application angular en cours d'exécution autonome, et j'essaie de créer une application d'électrons qui fait alors simplement: mainWindow.loadURL('http://localhost:4200/'); Ce n'est que localhost pour mon environnement de développement, cela le conditionne en réalité ne sera pas.

En électron, je règle nodeIntegration sur true, ce qui permet à mon application angular) d'accéder à ipc.

const mainWindow = new BrowserWindow({
    webPreferences: {
      nodeIntegration: true,
    }
  });

Dans angular j'ai ma fonction ping-pong:

  public playPingPong() {
    if(this._electronService.isElectronApp) {
      console.log('Is electron.')
      console.log(this._electronService.ipcRenderer);
      let pong: any = this._electronService.ipcRenderer.sendSync('ping', 'ping');
      console.log(pong);
    }
  }

Les erreurs d'application après la connexion de ipcRenderer avec l'erreur du titre:

core.js:5845 ERROR Error: Unable to deserialize cloned data due to invalid or unsupported version.
    at EventEmitter../lib/renderer/api/ipc-renderer.ts.ipcRenderer.sendSync (ipc-renderer.ts:13)
    at ArcMapComponent.playPingPong (arc-map.component.ts:61)
    at ArcMapComponent.ngOnInit (arc-map.component.ts:164)
    at callHook (core.js:3909)
    at callHooks (core.js:3873)
    at executeInitAndCheckHooks (core.js:3814)
    at refreshView (core.js:11723)
    at refreshDynamicEmbeddedViews (core.js:13070)
    at refreshView (core.js:11728)
    at refreshComponent (core.js:13145)

Merci d'avance!

5
John Wyant

J'ai eu le même problème. Je crois que lorsque vous utilisez ipcRenderer.sendSync il attend une valeur de retour.

par exemple.

Message sendSync du moteur de rendu

ipcRenderer.sendSync("pong_channel", { type: "ping"});

Ce code vient d'envoyer un message au processus principal avec un identifiant de canal de pong_channel et un objet json.

Principale .on Auditeur

ipcMain.on("pong_channel", (event, args) => {
    if(args.type === "pong") {
        print("Received pong successfully!")
    }
    event.returnValue = "received";
});

Le processus principal consiste à écouter sur le canal et à exécuter un effet secondaire. Mais le point clé est qu'il a renvoyé une valeur par event.returnValue. J'étais confronté au même problème, mais il a disparu une fois que j'ai défini la valeur returnValue.

J'ai aussi généralement mes noms de chaînes dans deux énumérations. Un contenant tous les messages adressés au processus principal et l'autre tous les messages adressés au moteur de rendu. Cela permet de garder les choses plus ordonnées qu'une chaîne.

J'espère que ça aide!

2
b-zurg