Extension for ServiceStack.Text
(including ServiceStack.Text.Core
) to allow using EnumMemberAttribute
to serialize and deserialize enumerations. This allows you to use more human readable values while still leveraging the benefits of using enumerations.
Custom enumeration serialization currently only applies to the json serializer. It works by assigning custom delegates to JsConfig<T>.SerializeFn
and JsConfig<T>.DeSerializeFn
. Nullable enumerations are also configured.
Configure explicit enumerations:
new EnumSerializerConfigurator()
.WithEnumTypes(new Type[] { typeof(ReturnPolicy) })
.Configure();
Configure all enumerations in the ExampleCode namespace for all assemblies in my current app domain:
new EnumSerializerConfigurator()
.WithAssemblies(AppDomain.CurrentDomain.GetAssemblies())
.WithNamespaceFilter(ns => ns.StartsWith("ExampleCode"))
.Configure();
using System.Runtime.Serialization;
namespace ExampleCode
{
public enum ReturnPolicy
{
NotSet = 0,
[EnumMember(Value = @"90 Days w/Receipt")]
_90DayswReceipt = 1,
[EnumMember(Value = @"15% Restocking Fee")]
_15RestockingFee = 2,
[EnumMember(Value = @"Exchange Only")]
ExchangeOnly = 3,
[EnumMember(Value = @"As-Is")]
AsIs = 4,
...
}
}
namespace ExampleCode
{
public class ProductInfo
{
public string ProductName { get; set; }
public ReturnPolicy ReturnPolicy { get; set; }
...
}
}
These will search for all product returnable within 90 days with receipt (all of these will work):
http://myhost/products?returnpolicy=90%20Days%20w%2FReceipt
http://myhost/products?returnpolicy=90%20DaYS%20w%2FReceIPt
http://myhost/products?returnpolicy=_90DayswReceipt
http://myhost/products?returnpolicy=1
With ServiceStack.Text.EnumMemberSerializer:
[
{
"ProductName": "Hammer",
"ReturnPolicy": "90 Days w/Receipt"
},
{
"ProductName": "Chisel",
"ReturnPolicy": "90 Days w/Receipt"
}
]
Without ServiceStack.Text.EnumMemberSerializer:
[
{
"ProductName": "Hammer",
"ReturnPolicy": "_90DayswReceipt"
},
{
"ProductName": "Chisel",
"ReturnPolicy": "_90DayswReceipt"
}
]
- Only configures public enumerations.
.WithNamespaceFilter()
only applies to filtering public enums found in the assemblies passed in using.WithAssemblies()
. Any enumerations explicitly identified.WithEnumTypes()
will not be filtered by namespace. The namespace filter applies to all provided assemblies.- Multiple calls to
.WithEnumTypes()
and.WithNamespaceFilter()
will be added and not replace previous specified values. - This manipulates the static
JsConfig<T>
. Other code called later may overwrite the custom serialization/deserialization delegates. - Both
.WithEnumTypes()
and.WithAssemblies()
may be used at the same time, the results will be combined. Configure()
should be called before serializing/deserializing anything withServiceStack.Text
or the custom methods may not be setup correctly inJsConfig
- Install the NuGet Package
- You can check out the code and run build.bat.
- It will create NuGet packages you can consume in
.\ReleasePackages
or you can directly use the resulting binaries.
- It will create NuGet packages you can consume in
- Build requirements
- .Net Framework 4.6
- .Net Core 2.0
- Powershell