'Protobuf Message With Arbitrary Type (.NET)
I want to send/receive values with arbitrary types. At first, I thought the Any
type would allow types such as string
int32
etc. but it seems that the type must implement IMessage
to pack or unpack it.
Is there a way to convert a string
to an Any
and vice versa?
If not, is there some other way to allow arbitrary types in messages?
E.g.
syntax = "proto3";
import "google/protobuf/any.proto";
package Engine;
message SomeMessage {
string Id = 1;
google.protobuf.Any AttributeValue = 2;
}
This code gives a compilation error in C#.
var someMessage = new SomeMessage
{
Id = "123",
AttributeValue = Any.Pack("Test")
};
Argument 1: cannot convert from 'string' to 'Google.Protobuf.IMessage'
Solution 1:[1]
It looks as though the answer may be the Value
type.
syntax = "proto3";
import "google/protobuf/struct.proto";
package Engine;
message SomeMessage {
string Id = 1;
google.protobuf.Value AttributeValue = 2;
}
Solution 2:[2]
Packing a string in an Any type:
var someMessage = new SomeMessage
{
Id = "123",
AttributeValue = Any.Pack(new StringValue { Value = "foo bar"})
};
Unpacking the string:
var data = pack.Unpack<StringValue>();
doSomething(data.Value);
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 |