2017-02-20 23 views
0

У меня есть приложение, которое хранит некоторые данные в базе данных SQL в двоичном поле. Эти данные сериализуются из объекта .net в традиционном .NET-приложении с binary serialization. Я пишу приложение .net core, которое должно взаимодействовать с вышеуказанным, но читая двоичные данные и понимая их.Как десериализовать двоичные данные в объекте в .net Core, когда начальный объект был сериализован с помощью Full .net Framework?

В идеале я хочу иметь возможность десериализовать эти данные с помощью .net Core, как если бы я работал с полной инфраструктурой .net. Сами данные не являются сложными, они всего лишь Dictionary<string,string>, произведенные старыми asp.net profile provider.

Мне нужно как читать, так и записывать двоичные данные из кода ядра .net.

Я понимаю, что поддержка BinaryFormatter is coming. .net core. Между тем, есть ли что-то не очень сложное, я могу сделать прямо сейчас, чтобы сериализовать/десериализовать данные с ядром .net в качестве полной .net-структуры?

+0

Почему бы не попробовать? –

+0

@LeiYang, что вы предлагаете попробовать? –

+0

Возможно, я вас неправильно понял. Я не знаком с ядром .net. вы имеете в виду в .net ядре, что вы не нашли форматировщика? –

ответ

0

Похоже, мы должны написать свои собственные методы BinaryReader/BinaryWriter ...

SCHEMA

CREATE TABLE dbo.BinaryTest (
    BinaryData varbinary(max) NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 
GO 

КОД

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using System.IO; 

namespace StackOverflow.ConsoleTester 
{ 
    public class Program 
    { 
     private const String SqlConnectionString = @"Server={Server};Database={Database};User={User};Password={Password};"; 

     public static void Main(String[] args) 
     { 
      using (var db = new SqlConnection(SqlConnectionString)) 
      { 
       var sqlCommand = new SqlCommand("DELETE FROM dbo.BinaryTest;", db) { CommandType = CommandType.Text }; 

       db.Open(); 

       sqlCommand.ExecuteNonQuery(); 
      } 

      using (var db = new SqlConnection(SqlConnectionString)) 
      { 
       var serializedData = new Dictionary<String, String> {{"key1", "value1"}, {"key2", "value2"}}; 

       var binaryData = WriteBinaryData(serializedData); 

       var sqlCommand = new SqlCommand("INSERT INTO dbo.BinaryTest (BinaryData) VALUES (@BinaryData);", db) { CommandType = CommandType.Text }; 

       var parameter = new SqlParameter("BinaryData", SqlDbType.VarBinary) {Value = binaryData}; 

       sqlCommand.Parameters.Add(parameter); 

       db.Open(); 

       sqlCommand.ExecuteNonQuery(); 
      } 

      Dictionary<String, String> deserializedData = null; 

      using (var db = new SqlConnection(SqlConnectionString)) 
      { 
       var sqlCommand = new SqlCommand("SELECT BinaryData FROM dbo.BinaryTest", db) { CommandType = CommandType.Text }; 

       db.Open(); 

       var reader = sqlCommand.ExecuteReader(); 

       while (reader.Read()) 
       { 
        deserializedData = ReadBinaryData(reader.GetSqlBinary(0)); 
       } 
      } 

      if (deserializedData != null) 
      { 
       foreach (var item in deserializedData) 
       { 
        Console.WriteLine($"Key: {item.Key}; Value: {item.Value}"); 
       } 
      } 

      Console.ReadKey(); 
     } 

     private static Byte[] WriteBinaryData(Dictionary<String, String> data) 
     { 
      var memoryStream = new MemoryStream(); 
      var binaryWriter = new BinaryWriter(memoryStream); 

      foreach (var item in data) 
      { 
       binaryWriter.Write(item.Key); 
       binaryWriter.Write(item.Value); 
      } 

      var binaryData = memoryStream.ToArray(); 

      return binaryData; 
     } 

     private static Dictionary<String, String> ReadBinaryData(SqlBinary data) 
     { 
      var model = new Dictionary<String, String>(); 

      var memoryStream = new MemoryStream(data.Value); 
      var binaryReader = new BinaryReader(memoryStream); 

      while (binaryReader.BaseStream.Position != binaryReader.BaseStream.Length) 
      { 
       model.Add(binaryReader.ReadString(), binaryReader.ReadString()); 
      } 

      return model; 
     } 
    } 
} 
+0

Существует много библиотек, которые выполняют сериализацию/де-сериализацию. Например, [protobuf] (https://github.com/mgravell/protobuf-net) или [BinaryFormatter] (https://github.com/lukasz-pyrzyk/BinaryFormatter). Они не помогают в чтении (или написании) любого стандартного .Net Binary Serializer. Если я чего-то не хватает, ваш код тоже не поможет. Возможно, вам захочется попробовать Сериализовать что-то со стандартными средствами .NET, а затем посмотреть, может ли ваш код десериализовать результат. Он не выглядит так, как может. –