警告:代码仅供参考,使用前请三思,作者很懒,有issue也不会很快修复的。
sproto-cs is a sproto library writen in c#.
use SpTypeManager to manage your protocols and types. there's two way to create a SpTypeManager, from stream or from string.
using (FileStream stream = new FileStream ("foobar.sproto", FileMode.Open)) {
SpTypeManager tm = SpTypeManager.Import (stream);
}
or
string client_proto = @"
.package {
type 0 : integer
session 1 : integer
}
";
SpTypeManager tm = SpTypeManager.Import (client_proto);
use SpObject to set/get all data you need. SpObject could be so many things (int, bool, string, array, table...).
SpObject a = new SpObject (true);
SpObject b = new SpObject (1000);
SpObject c = new SpObject ("hello");
SpObject obj = new SpObject (SpObject.ArgType.Table,
"a", "hello",
"b", 1000000,
"c", true,
"d", new SpObject (SpObject.ArgType.Table,
"a", "world",
"c", -1),
"e", new SpObject (SpObject.ArgType.Array, "ABC", "def"),
"f", new SpObject (SpObject.ArgType.Array, -3, -2, -1, 0, 1, 2),
"g", new SpObject (SpObject.ArgType.Array, true, false, true),
"h", new SpObject (SpObject.ArgType.Array,
new SpObject (SpObject.ArgType.Table, "b", 100),
new SpObject (),
new SpObject (SpObject.ArgType.Table, "b", -100, "c", false),
new SpObject (SpObject.ArgType.Table, "b", 0, "e", new SpObject (SpObject.ArgType.Array, "test")))
);
Util.Assert (obj["a"].AsString ().Equals ("hello"));
Util.Assert (obj["b"].AsInt () == 1000000);
Util.Assert (obj["c"].AsBoolean () == true);
Util.Assert (obj["d"]["a"].AsString ().Equals ("world"));
Util.Assert (obj["d"]["c"].AsInt () == -1);
Util.Assert (obj["e"][0].AsString ().Equals ("ABC"));
Util.Assert (obj["e"][1].AsString ().Equals ("def"));
Util.Assert (obj["f"][0].AsInt () == -3);
Util.Assert (obj["f"][1].AsInt () == -2);
Util.Assert (obj["f"][2].AsInt () == -1);
Util.Assert (obj["f"][3].AsInt () == 0);
Util.Assert (obj["f"][4].AsInt () == 1);
Util.Assert (obj["f"][5].AsInt () == 2);
Util.Assert (obj["g"][0].AsBoolean () == true);
Util.Assert (obj["g"][1].AsBoolean () == false);
Util.Assert (obj["g"][2].AsBoolean () == true);
Util.Assert (obj["h"][0]["b"].AsInt () == 100);
Util.Assert (obj["h"][1].Value == null);
Util.Assert (obj["h"][2]["b"].AsInt () == -100);
Util.Assert (obj["h"][2]["c"].AsBoolean () == false);
Util.Assert (obj["h"][3]["b"].AsInt () == 0);
Util.Assert (obj["h"][3]["e"][0].AsString ().Equals ("test"));
use SpCodec to encode/decode your data
SpStream encode_stream = tm.Codec.Encode ("foobar", obj)
SpObject newObj = tm.Codec.Decode ("foobar", encode_stream);
use SpPacker to pack/unpack your data
SpStream pack_stream = SpPacker.Pack (encode_stream);
SpStream decode_stream = SpPacker.Unpack (pack_stream);
SpRpc client = SpRpc.Create (client_proto, "package");
client.Attach (server_proto);
client.Request ("foobar", args, session);
public void Run () {
SpTypeManager manager;
using (FileStream stream = new FileStream (path, FileMode.Open)) {
manager = SpTypeManager.Import (stream);
}
SpObject obj = CreateObject ();
// encode
SpStream encode_stream = new SpStream ();
manager.Codec.Encode ("AddressBook", obj, encode_stream);
// another way to encode obj
SpStream another_encode_stream = manager.Codec.Encode ("AddressBook", obj);
// decode
encode_stream.Position = 0;
SpObject newObj = manager.Codec.Encode ("AddressBook", encode_stream);
// pack
encode_stream.Position = 0;
SpStream pack_stream = new SpStream ();
SpPacker.Pack (encode_stream, pack_stream);
// another way to pack
encode_stream.Position = 0;
SpStream another_pack_stream = SpPacker.Pack (encode_stream);
// unpack
pack_stream.Position = 0;
SpStream unpack_stream = new SpStream ();
SpPacker.Unpack (pack_stream, unpack_stream);
// another way to pack
pack_stream.Position = 0;
SpStream another_unpack_stream = SpPacker.Unpack (pack_stream);
unpack_stream.Position = 0;
newObj = manager.Codec.Decode ("AddressBook", unpack_stream);
}
private SpObject CreateObject () {
SpObject obj = new SpObject ();
SpObject person = new SpObject ();
SpObject p = new SpObject ();
p.Insert ("name", "Alice");
p.Insert ("id", 10000);
SpObject phone = new SpObject ();
{
SpObject p1 = new SpObject ();
p1.Insert ("number", "123456789");
p1.Insert ("type", 1);
phone.Append (p1);
}
p.Insert ("phone", phone);
person.Append (p);
obj.Insert ("person", person);
return obj;
}
please check out sproto-u3d