Isolate.spawnUri в настоящее время приводит к ошибке при включении SendPort в сообщение?

Текущая среда дартс:
Версия VM Dart: 2.0.0-dev.69.0 (Неизвестная временная метка) на "linux_x64"

Я пытаюсь породить изолят через изолят.spawnUri и включите SendPort в сообщение. Код, который у меня есть, настроен так:

import 'dart:convert' show json;
import 'dart:isolate';

var servicePort = new ReceivePort()
  ..listen (/stuff to handle response/);

Map isolateRequest = {
  'sendPort': servicePort.sendPort,  <-- String => SendPort
  'info': json.encode (/info to send to spawned isolate/)  <-- String => String
};

Isolate.spawnUri (new Uri.file (/isolate main/), [], isolateRequest);

Этот тип настройки используется для работы. Теперь я получаю следующую ошибку:

"Недопустимый аргумент (ы): недопустимый аргумент в изолированном сообщении: (объект является обычным экземпляром Dart)"

Два ключа для карты являются строками, а значения включают SendPort и другую строку. Просто, ничего особенного, и должно быть приемлемо для отправки в качестве сообщения для порождения изолята (прекрасно работало до нескольких дней назад).

Вопросы: что изменилось, что я сейчас что-то делаю не так? Каковы возможные обходные пути?

Любая помощь будет оценена.

1 ответ

Это не воспроизводится для меня со свежесобранной виртуальной машиной из тега 2.0.0-dev.69.0 (--version: версия VM Dart: 2.0.0-dev.69.0 (вт 17 июля 14:57:16 2018 +0200) на "linux_x64").

Используя эту полную программу:

import 'dart:convert' show json;                                                    
import 'dart:isolate';
main(args, message) {
  if (message != null) {
    print("Out, ");
    message["sendPort"].send("And home again!");
    return;
  }
  var servicePort = new ReceivePort();
  servicePort.forEach((m) {  
    print(m);
    servicePort.close();
  });
  Map isolateRequest = {
    'sendPort': servicePort.sendPort, //  <-- String => SendPort
    'info': json.encode({})  // <-- String => String
  };
  Isolate.spawnUri (new Uri(path:"iso.dart"), [], isolateRequest);
}

он работает и печатает ожидаемые строки. Изолированный запрос действительно выглядит как нечто, что должно быть сериализуемым (сопоставление со строковыми ключами и значениями, которые являются либо строками, либо SendPort), что - то еще должно происходить в коде, который вы не показываете.

Можете ли вы извлечь работающую программу из вашего кода, которая все еще демонстрирует такое поведение, или сказать что-то еще о том, что происходит вокруг кода?

Другие вопросы по тегам