Есть ли способ оптимизировать производительность ServiceStack.Text (версия 5.4.0) при десериализации перечисляемых значений в перечисления .Net с установленными атрибутами DataContract и EnumMember ?Я хотел бы использовать атрибуты EnumMember для определения сериализованных имен, но, к сожалению, ServiceStack.Text, по-видимому, требуется примерно в три раза больше времени для десериализации с использованием этого метода, в отличие от десериализации на основе простых имен элементов перечисления.
ДляНапример, рассмотрим простую тестовую программу на C #:
using ServiceStack;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.Serialization;
using System.Text;
namespace ServiceStackPerformance
{
public class Program
{
[DataContract]
enum DataContractEnum
{
[EnumMember(Value = "first")]
First = 0,
[EnumMember(Value = "second")]
Second = 1,
}
enum PlainEnum
{
first = 0,
second = 1,
}
[DataContract]
class DataContractEnumList
{
[DataMember(Name = "values")]
public List<DataContractEnum> Values { get; set; }
}
[DataContract]
class PlainEnumList
{
[DataMember(Name = "values")]
public List<PlainEnum> Values { get; set; }
}
static void Main(string[] args)
{
int size = 100000;
string test = GenerateTestString(size);
var stopwatch = new Stopwatch();
stopwatch.Start();
var dataContractEnumList = test.FromJson<DataContractEnumList>();
var dataContractMs = stopwatch.ElapsedMilliseconds;
stopwatch.Restart();
var plainType = test.FromJson<PlainEnumList>();
var plainMs = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"Deserializing input of size {2*size+1} to data contract enum took {dataContractMs} ms.");
Console.WriteLine($"Deserializing input of size {2*size+1} to simple enum took {plainMs} ms.");
}
private static string GenerateTestString(int size)
{
var builder = new StringBuilder(10*size);
builder.Append("{\"values\":[");
for ( int i = 0; i < size; i++)
{
builder.Append("\"first\",\"second\",");
}
builder.Append("\"first\"]}");
return builder.ToString();
}
}
}
вывод выглядит следующим образом:
Deserializing input of size 200001 to data contract enum took 3520 ms.
Deserializing input of size 200001 to simple enum took 1131 ms.
Существуют ли какие-либо методы кэширования или другие оптимизации производительности, которые я мог бы включить, чтобы избежать замедления?