using Newtonsoft.Json;
using XGame.Framework.Serialization;
namespace etoy
{
///
/// 序列化用枚举对象
/// 不能反序列化
///
class SerializableEnum : ISerializable
{
public string fieldType;
public string fieldName;
public bool isRepeated;
public string value;
public MetadataStruct meta;
void ISerializable.Deserialize(IReader reader)
{
throw new NotImplementedException();
}
void ISerializable.Serialize(IWriter writer)
{
if (isRepeated)
{
int[] enumIntVals = null;
try
{
enumIntVals = JsonConvert.DeserializeObject(value);
}
catch (Exception ex)
{
Console.WriteLine($"枚举数组转int[]失败 Type:{fieldType} Name:{fieldName} Value:{value} Message:{ex.Message}");
}
if (enumIntVals == null)
{
var enumVals = JsonConvert.DeserializeObject(value);
var count = enumVals?.Length ?? 0;
enumIntVals = new int[count];
for (int i = 0; i < count; i++)
{
if (!int.TryParse(enumVals[i], out var intVal))
{ // 存的是枚举的名字
var field = meta.Fields.First(a => a.Name.Equals(enumVals[i], StringComparison.OrdinalIgnoreCase));
intVal = field?.EnumIntVal ?? 0;
}
enumIntVals[i] = intVal;
}
}
writer.Write(enumIntVals);
}
else
{
if (!int.TryParse(value, out var intVal))
{ // value存的是枚举的名字
var field = meta.Fields.First(a => a.Name.Equals(value, StringComparison.OrdinalIgnoreCase));
intVal = field?.EnumIntVal ?? 0;
}
writer.Write(intVal);
}
}
}
}