2

我刚刚看到有一些用于运行 Dart Web 服务器的库,比如Start。所以我在想这样的事情。如果客户端和服务器代码都是用 Dart 编写的,是否可以通过 websockets(或正常的 REST)发送“Dart 对象”,以便类型信息保留在另一端?或者我是否需要通过 JSON 或类似的方式进行序列化/反序列化?还是我在这里想太多了?

问候奥斯卡

4

2 回答 2

7

您将需要以某种方式序列化 Dart 对象。你可以试试 JSON,也可以试试重型序列化包

自定义 Dart 类没有全自动 JSON 序列化。您将需要添加一个自定义 toJson 序列化程序并创建某种 fromJson 构造函数。

例如,如果你有一个 Person 类,你可以这样做:

import 'dart:json' as json;

class Person {
  String name;
  int age;

  Person(this.name, this.age);

  Person.fromJson(String json) {
    Map data = json.parse(json);
    name = data['name'];
    age = data['age'];
  }

  Map toJson() {
    return {'name': name, 'age': age};
  }
}

注意:这fromJson只是一个约定。您需要以某种方式调用它,没有内置机制来获取任意 JSON 字符串并在您的自定义对象上调用正确的构造函数。

如上所述,序列化包重量更重,但功能更全。这是其文档中的一个示例:

 // uses the serialization package
 var address = new Address();
 address.street = 'N 34th';
 address.city = 'Seattle';
 var serialization = new Serialization()
     ..addRuleFor(address);
 Map output = serialization.write(address);

 // uses serialization
 var serialization = new Serialization()
   ..addRuleFor(address,
       constructor: "create",
       constructorFields: ["number", "street"],
       fields: ["city"]);
于 2013-08-25T09:45:36.930 回答
4

您可以使用“可导出”包以更具声明性的方式将您的类呈现为 JSON 或地图。

import 'package:exportable/exportable.dart';

class Product extends Object with Exportable
{
  @export String ProductName;
  @export num UnitPrice;
  @export bool Discontinued;
  @export num UnitsInStock;

  Product(this.ProductName, this.UnitPrice, this.Discontinued, this.UnitsInStock);  
}

Product prod = new Product("First", 1.0, false, 3 );
var json = prod.toJson();  // {"ProductName":"First","UnitPrice":1.0,"Discontinued":false,"UnitsInStock":3}
于 2014-08-15T01:12:02.437 回答