2016-03-29 3 views
0

Я хочу сделать двоичный сериализатор словарного объекта.Сериализация и десериализация словаря в двоичном формате

Это мой объект словаря

public Dictionary<int, UserSessionInfo> UserSessionLookupTable = new Dictionary<int, UserSessionInfo>(); 

Это мой UserSessionInfo класс

public class UserSessionInfo 
    { 
     public int SessionId { get; set; } 
     public string UserName { get; set; } 
     public Guid SessionGuid { get; set; } 
     public DateTime LoginTime { get; set; } 
     public bool IsActiveUser { get; set; } 
     public RowState State { get; set; } 
} 

Это, как я создаю словарь запись во время входа пользователя

UserSessionLookupTable.Add(SessionId, userSessionInfoLogin); 

Теперь я хотите бинарный сериализовать объект UserSessionLookupTable. Как я могу это сделать?

Я попытался

var binFormatter = new BinaryFormatter(); 
       var mStream = new MemoryStream(); 
       binFormatter.Serialize(mStream, UserSessionLookupTable); 
       mStream.ToArray(); 

Будет ли это работает?

Также как я могу удалить запись из словаря при выходе пользователя из системы?

ответ

2

Ниже метода расширения для использования стандартного .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

+0

Отлично, спасибо большое! :-) –

+0

Добро пожаловать, если это решает проблему, пожалуйста, отметьте как ответ слишком –