我刚刚看到有一些库用于运行Dart web服务器,比如Start。所以我在想这样的事情。。如果客户端和服务器代码都是用Dart编写的,那么是否可以通过websocket(或者正常的REST)发送"Dart对象",以便类型信息保留在另一端?或者我需要通过JSON或类似的东西进行序列化/反序列化吗?还是我想得太多了?
关于Oskar
您需要以某种方式序列化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"]);
您可以使用'exportable'包以更具声明性的方式将类呈现为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}