1.11 编解码器
优质
小牛编辑
132浏览
2023-12-01
编解码器
服务端和客户端拥有各自的编解码器接口定义。虽然在形式上,不同的语言有所不同,但参数都是一样的。
例如在 C# 中,接口定义为:
public interface IServiceCodec {
MemoryStream Encode(object result, ServiceContext context);
(string, object[]) Decode(MemoryStream request, ServiceContext context);
}
public interface IClientCodec {
MemoryStream Encode(string name, object[] args, ClientContext context);
object Decode(MemoryStream response, ClientContext context);
}
在 TypeScript,接口定义为:
interface ServiceCodec {
encode(result: any, context: ServiceContext): Uint8Array;
decode(request: Uint8Array, context: ServiceContext): [string, any[]];
}
interface ClientCodec {
encode(name: string, args: any[], context: ClientContext): Uint8Array;
decode(response: Uint8Array, context: ClientContext): any;
}
在 Dart 中,接口定义为:
class RequestInfo {
final String name;
final List args;
RequestInfo(this.name, this.args);
}
abstract class ServiceCodec {
Uint8List encode(result, ServiceContext context);
RequestInfo decode(Uint8List request, ServiceContext context);
}
abstract class ClientCodec {
Uint8List encode(String name, List args, ClientContext context);
dynamic decode(Uint8List response, ClientContext context);
}
Hprose 3.0 中内置的默认编解码器是使用 hprose 序列化和 hprose RPC 编码协议实现的。另外,还提供了 JSONRPC 2.0 编解码器。它们都是上面这两个接口的具体实现。用户可以通过自定义编解码器来支持更多的 RPC 协议。
客户端和服务端各有一个 codec
属性,该属性的默认值为 hprose 编解码器。通过给该属性赋值为其它编解码器的实例对象,可以将客户端或服务端变为其它类型的 RPC 客户端或服务端。