This repo compliments the other repo that I created earlier in C++ using grpc as an rpc framework referenced below: https://github.com/jppathak/RpcFramework
This is extending the work to .Net. .NET API for grpc is found to be more clean than C++ version and hence defining a custom serilization/contracts is much easier(as below). This does not require any protobuf binaries. See the packages folder for dependencies.
In production code, we use "Protobuf.Net"(another great repo: https://github.com/mgravell/protobuf-net) as a way to serialize data, which is effectively using "Protobuf", however it does not require custom stub generation.
public static class Serializer<T> where T : IMessage, new()
{
static public byte[] Serilize(T obj)
{
var data = (obj as IMessage).Data;
return System.Text.Encoding.UTF8.GetBytes(data);
}
public static T Deserilize(byte[] input)
{
string temp = System.Text.Encoding.UTF8.GetString(input);
var obj = new T();
(obj as IMessage).Data = temp;
return obj;
}
}
public static class ServiceContracts
{
public static readonly Method<string, string> ProcessRequestString = new Method<string, string>(
type: MethodType.Unary,
serviceName: "SimpleGrpcService",
name: "ProcessStringRequest",
requestMarshaller: Marshallers.Create(
serializer: Serializer.Serilize,
deserializer: Serializer.Deserilize),
responseMarshaller: Marshallers.Create(
serializer: Serializer.Serilize,
deserializer: Serializer.Deserilize));
public static readonly Method<Request, Response> ProcessRequestViaServerUpdateReported =
new Method<Request, Response>(
type: MethodType.ServerStreaming,
serviceName: "SimpleGrpcService",
name: "ProcessRequestViaServerUpdateReported",
requestMarshaller: Marshallers.Create(
serializer: Serializer<Request>.Serilize,
deserializer: Serializer<Request>.Deserilize),
responseMarshaller: Marshallers.Create(
serializer: Serializer<Response>.Serilize,
deserializer: Serializer<Response>.Deserilize));
}