Ниже метода расширения для использования стандартного .Net двоичного сериалайзера, а также для десериализации и сжимать и распаковывать его уменьшить размер массива байт:
public static class ObjectSerialize
{
public static byte[] Serialize(this Object obj)
{
if (obj == null)
{
return null;
}
using (var memoryStream = new MemoryStream())
{
var binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, obj);
var compressed = Compress(memoryStream.ToArray());
return compressed;
}
}
public static Object DeSerialize(this byte[] arrBytes)
{
using (var memoryStream = new MemoryStream())
{
var binaryFormatter = new BinaryFormatter();
var decompressed = Decompress(arrBytes);
memoryStream.Write(decompressed, 0, decompressed.Length);
memoryStream.Seek(0, SeekOrigin.Begin);
return binaryFormatter.Deserialize(memoryStream);
}
}
public static byte[] Compress(byte[] input)
{
byte[] compressesData;
using (var outputStream = new MemoryStream())
{
using (var zip = new GZipStream(outputStream, CompressionMode.Compress))
{
zip.Write(input, 0, input.Length);
}
compressesData = outputStream.ToArray();
}
return compressesData;
}
public static byte[] Decompress(byte[] input)
{
byte[] decompressedData;
using (var outputStream = new MemoryStream())
{
using (var inputStream = new MemoryStream(input))
{
using (var zip = new GZipStream(inputStream, CompressionMode.Decompress))
{
zip.CopyTo(outputStream);
}
}
decompressedData = outputStream.ToArray();
}
return decompressedData;
}
}
Однако я хотел бы предложить, что вы используете для ProtoBuf
двоичная сериализация, больше деталей here
Она будет работать так же просто, как:
using ProtoBuf
var memoryStream = new MemoryStream();
// Serialize the Data to Stream
byte[] data = Serializer.Serialize(memoryStream, UserSessionLookupTable);
Здесь также вы можете включить сжатие и декомпрессию, предложенные выше, по моему опыту ProBuf намного быстрее, чем стандартный Serialize.
Для изменения ничего в словаре вам нужно deserialize
путем вызова метода выше в случае стандартного сериализатором:
var userSessionLookUpDeserialize =
(Dictionary<int,UserSessionInfo>)data.DeSerialize();
Ниже приводится код Protobuf:
var userSessionLookUpDeserialize = Serializer.Deserialize<Dictionary<int, UserSessionInfo>>(new MemoryStream(deCompresseBytes));
Теперь внести изменения до userSessionLookUpDeserialize
Отлично, спасибо большое! :-) –
Добро пожаловать, если это решает проблему, пожалуйста, отметьте как ответ слишком –