簡體   English   中英

當使用Full .net Framework序列化初始對象時,如何將二進制數據反序列化為.net Core中的對象?

[英]How do I deserialize binary data into an object in .net Core, when the initial object was serialized with Full .net Framework?

我有一個應用程序,該應用程序將一些數據存儲在二進制字段的SQL數據庫中。 這些數據是使用二進制序列化從傳統.NET應用程序中的.net對象進行序列化的 我正在編寫一個.net核心應用程序,該應用程序需要與上述接口進行交互,但需要讀取二進制數據並使它們有意義。

理想情況下,我希望能夠使用.net Core反序列化這些數據,就像運行完整的.net框架一樣。 數據本身並不復雜,它們只是由舊的asp.net配置文件提供程序生成的Dictionary<string,string>

我需要從.net核心代碼讀取和寫入二進制數據。

我理解的BinaryFormatter的支持即將於.NET的核心。 在此期間,有什么不是很復雜我現在序列化與.NET的核心/反序列化數據為完整的.NET框架將能做到?

看來我們必須編寫我們自己的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;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM