Source/Tx.Bond/JsonTransformBuilder.cs (61 lines of code) (raw):
namespace Tx.Bond
{
using System;
using System.Reactive;
using System.Text;
using System.Web.Script.Serialization;
using Tx.Core;
public class JsonTransformBuilder : ITransformBuilder<IEnvelope>
{
internal static readonly JavaScriptSerializer DefaultSerializer;
private readonly JavaScriptSerializer serializer;
static JsonTransformBuilder()
{
DefaultSerializer = new JavaScriptSerializer();
}
public JsonTransformBuilder()
: this(DefaultSerializer)
{
}
public JsonTransformBuilder(JavaScriptSerializer serializer)
{
if (serializer == null)
{
throw new ArgumentNullException(nameof(serializer));
}
this.serializer = serializer;
}
public Func<TIn, IEnvelope> Build<TIn>()
{
return new JsonTransformer<TIn>(this.serializer).Transform;
}
internal sealed class JsonTransformer<T>
{
private readonly StringBuilder stringBuilder = new StringBuilder(64);
private readonly string manifestId;
private readonly JavaScriptSerializer serializer;
public JsonTransformer(JavaScriptSerializer serializer)
{
this.serializer = serializer;
this.manifestId = typeof(T).GetTypeIdentifier();
}
public IEnvelope Transform(T value)
{
var now = DateTime.UtcNow;
this.stringBuilder.Clear();
this.serializer.Serialize(value, this.stringBuilder);
var json = this.stringBuilder.ToString();
var payload = Encoding.UTF8.GetBytes(json);
var envelope = new Envelope(
now,
now,
Protocol.Json,
null,
this.manifestId,
payload,
null);
return envelope;
}
}
}
}