Extension for ServiceStack.Text to allow using EnumMember attributes to serialize and deserialize enumerations.
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src
.gitignore
LICENSE
LICENSE_ServiceStack
README.md
build.bat
build.cake
build.ps1
default.ps1

README.md

ServiceStack.Text.EnumMemberSerializer

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.

Example Configuration

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();

Example Enumeration

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,
    ...
  }
}

Example Dto

namespace ExampleCode
{
  public class ProductInfo
  {
    public string ProductName { get; set; }
    public ReturnPolicy ReturnPolicy { get; set; }
    ...
  }
}

Url Examples

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

Example Response

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"
   }
]

Considerations

  • 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 with ServiceStack.Text or the custom methods may not be setup correctly in JsConfig

Using the Code

  • 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.
  • Build requirements
    • .Net Framework 4.6
    • .Net Core 2.0
    • Powershell