Skip to content

Instantly share code, notes, and snippets.

@fum1h1ro
Created December 11, 2015 03:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fum1h1ro/a21cd41ff121dbc5a58c to your computer and use it in GitHub Desktop.
Save fum1h1ro/a21cd41ff121dbc5a58c to your computer and use it in GitHub Desktop.
iOS実機でも動くmsgpackシリアライザ
public class Parameters {
public float warrior_walk_speed;
public float warrior_run_speed;
public int warrior_life;
public float hungry_speed;
public float initial_bread;
}
public class CustomSerializer<T> : MessagePackSerializer<T> where T : class, new() {
public CustomSerializer(SerializationContext ownerContext) : base(ownerContext) {}
protected override void PackToCore(Packer packer, T objectTree) {
var type = typeof(T);
foreach (var fi in type.GetFields()) {
if (!fi.IsPublic) continue;
switch (Type.GetTypeCode(fi.FieldType)) {
case TypeCode.Int32:
packer.Pack((int)fi.GetValue(objectTree));
break;
case TypeCode.Single:
packer.Pack((float)fi.GetValue(objectTree));
break;
case TypeCode.String:
packer.Pack(fi.GetValue(objectTree) as string);
break;
}
}
}
protected override T UnpackFromCore(Unpacker unpacker) {
var p = new T();
var type = typeof(T);
foreach (var fi in type.GetFields()) {
if (!fi.IsPublic) continue;
switch (Type.GetTypeCode(fi.FieldType)) {
case TypeCode.Int32:
fi.SetValue(p, unpacker.LastReadData.AsInt32());
break;
case TypeCode.Single:
fi.SetValue(p, unpacker.LastReadData.AsSingle());
break;
case TypeCode.String:
fi.SetValue(p, unpacker.LastReadData.ToString());
break;
}
}
return p;
}
}
public void RegisterAndUseCustomSerializer() {
var stream = new MemoryStream();
var context = new SerializationContext();
context.Serializers.RegisterOverride(new CustomSerializer<Parameters>(context));
var serializer = MessagePackSerializer.Get<Parameters>(context);
var parameters = new Parameters();
parameters.warrior_walk_speed = 50.0f;
serializer.Pack(stream, parameters);
stream.Position = 0;
var deserialized = serializer.Unpack(stream);
Debug.Log(string.Format( "Ticks are same? {0}", parameters.warrior_walk_speed == deserialized.warrior_walk_speed ));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment