动态反序列化
当调用 `MessagePackSerializer.Deserialize<object>` 或 `MessagePackSerializer.Deserialize<dynamic>` 时,二进制数据中存在的任何值都将被转换为基本值,即 bool、char、sbyte、byte、short、int、long、ushort、uint、ulong、float、double、DateTime、string、byte[]、object[]、IDictionary<object, object>。
/****************************************************
文件:Test_06.cs
作者:Edision
日期:#CreateTime#
功能:示例6:动态反序列化
*****************************************************/
using MessagePack;
using MessagePack.Resolvers;
using UnityEngine;
public class Test_06 : MonoBehaviour
{
public void Test()
{
// 示例数据.
var model = new DynamicModel { Name = "foobar", Items = new[] { 1, 10, 100, 1000 } };
var blob = MessagePackSerializer.Serialize(model, ContractlessStandardResolver.Options);
使用dynamic类型进行反序列化时,Unity环境未能正确处理C#的动态特性。
//var deserializedModel = MessagePackSerializer.Deserialize<dynamic>(blob, ContractlessStandardResolver.Options);
//Debug.Log(deserializedModel["Name"]); // foobar
//Debug.Log(deserializedModel["Items"][2]); // 100
// 使用具体类型进行反序列化.
var deserializedModel = MessagePackSerializer.Deserialize<DynamicModel>(blob, MessagePack.Resolvers.ContractlessStandardResolver.Options);
Debug.Log(deserializedModel.Name); // 输出: foobar
Debug.Log(deserializedModel.Items[2]); // 输出: 100
}
[MessagePackObject]
public class DynamicModel
{
[Key(0)]
public string Name { get; set; }
[Key(1)]
public int[] Items { get; set; }
public DynamicModel()
{
// 默认构造函数
}
public DynamicModel(string name, int[] items)
{
Name = name;
Items = items;
}
public override string ToString()
{
return $"Name: {Name}, Items: [{string.Join(", ", Items)}]";
}
}
}
Object 类型 序列化
StandardResolver 和 ContractlessStandardResolver 可以序列化对象/匿名类型对象。
/****************************************************
文件:Test_06.cs
作者:Edision
日期:#CreateTime#
功能:示例6:动态反序列化
*****************************************************/
using MessagePack;
using MessagePack.Resolvers;
using UnityEngine;
public class Test_06 : MonoBehaviour
{
public void Test()
{
// 示例数据.
var model = new DynamicModel { Name = "foobar", Items = new[] { 1, 10, 100, 1000 } };
var blob = MessagePackSerializer.Serialize(model, ContractlessStandardResolver.Options);
使用dynamic类型进行反序列化时,Unity环境未能正确处理C#的动态特性。
//var deserializedModel = MessagePackSerializer.Deserialize<dynamic>(blob, ContractlessStandardResolver.Options);
//Debug.Log(deserializedModel["Name"]); // foobar
//Debug.Log(deserializedModel["Items"][2]); // 100
// 使用具体类型进行反序列化.
var deserializedModel = MessagePackSerializer.Deserialize<DynamicModel>(blob, ContractlessStandardResolver.Options);
Debug.Log(deserializedModel.Name); // 输出: foobar
Debug.Log(deserializedModel.Items[2]); // 输出: 100
var objects = new object[] { 1, "aaa", new ObjectFieldType { Anything = 9999 } };
var bin = MessagePackSerializer.Serialize(objects);
// [1,"aaa",[9999]]
Debug.Log(MessagePackSerializer.ConvertToJson(bin));
// Support anonymous Type Serialize
var anonType = new { Foo = 100, Bar = "foobar" };
var bin2 = MessagePackSerializer.Serialize(anonType, ContractlessStandardResolverAllowPrivate.Options);
// {"Foo":100,"Bar":"foobar"}
Debug.Log(MessagePackSerializer.ConvertToJson(bin2));
}
[MessagePackObject]
public class DynamicModel
{
[Key(0)]
public string Name { get; set; }
[Key(1)]
public int[] Items { get; set; }
public DynamicModel()
{
// 默认构造函数
}
public DynamicModel(string name, int[] items)
{
Name = name;
Items = items;
}
public override string ToString()
{
return $"Name: {Name}, Items: [{string.Join(", ", Items)}]";
}
}
[MessagePackObject]
public class ObjectFieldType
{
[Key(0)]
public int Anything { get; set; }
public ObjectFieldType()
{
// 默认构造函数
}
public ObjectFieldType(int anything)
{
Anything = anything;
}
public override string ToString()
{
return $"Anything: {Anything}";
}
}
}
在反序列化时,与动态(未类型化)反序列化相同。