上海苏宁宝丽嘉酒店,2020.11.17 15:30改为单机版本,以后合成单机版本可以以此版本为模板
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

50 lines
1.7 KiB

using System;
using System.Collections.Generic;
namespace MessagePack.Formatters
{
// Note:This implemenataion is 'not' fastest, should more improve.
public sealed class EnumAsStringFormatter<T> : IMessagePackFormatter<T>
{
readonly Dictionary<string, T> nameValueMapping;
readonly Dictionary<T, string> valueNameMapping;
public EnumAsStringFormatter()
{
var names = Enum.GetNames(typeof(T));
var values = Enum.GetValues(typeof(T));
nameValueMapping = new Dictionary<string, T>(names.Length);
valueNameMapping = new Dictionary<T, string>(names.Length);
for (int i = 0; i < names.Length; i++)
{
nameValueMapping[names[i]] = (T)values.GetValue(i);
valueNameMapping[(T)values.GetValue(i)] = names[i];
}
}
public int Serialize(ref byte[] bytes, int offset, T value, IFormatterResolver formatterResolver)
{
string name;
if (!valueNameMapping.TryGetValue(value, out name))
{
name = value.ToString(); // fallback for flags etc, But Enum.ToString is too slow.
}
return MessagePackBinary.WriteString(ref bytes, offset, name);
}
public T Deserialize(byte[] bytes, int offset, IFormatterResolver formatterResolver, out int readSize)
{
var name = MessagePackBinary.ReadString(bytes, offset, out readSize);
T value;
if (!nameValueMapping.TryGetValue(name, out value))
{
value = (T)Enum.Parse(typeof(T), name); // Enum.Parse is too slow
}
return value;
}
}
}