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
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; |
|
} |
|
} |
|
}
|
|
|