// Copyright Epic Games, Inc. All Rights Reserved.
using System.IO;
using EpicGames.Core;
using Google.Protobuf;
using Google.Protobuf.Reflection;
using ProtoBuf;
using StackExchange.Redis;
namespace EpicGames.Redis.Converters
{
///
/// Converter for records to Redis values using protobuf serialization.
///
/// The record type
public class RedisProtobufConverter : IRedisConverter where T : IMessage, new()
{
readonly MessageDescriptor _descriptor;
///
/// Constructor
///
public RedisProtobufConverter()
{
_descriptor = new T().Descriptor;
}
///
public T FromRedisValue(RedisValue value)
{
return (T)_descriptor.Parser.ParseFrom((byte[])value!);
}
///
public RedisValue ToRedisValue(T value)
{
return value.ToByteArray();
}
}
///
/// Converter for records to Redis values using ProtoBuf-Net annotations.
///
/// The record type
public class RedisProtobufNetConverter : IRedisConverter
{
///
public RedisValue ToRedisValue(T value)
{
using (MemoryStream stream = new MemoryStream())
{
Serializer.Serialize(stream, value);
return stream.ToArray();
}
}
///
public T FromRedisValue(RedisValue value)
{
using (ReadOnlyMemoryStream stream = new ReadOnlyMemoryStream(value))
{
T result = Serializer.Deserialize(stream);
return result;
}
}
}
}