.net core BinaryFormatter序列化dotnet核心和框架兼容吗?

.net core BinaryFormatter序列化dotnet核心和框架兼容吗?,.net-core,.net-4.0,binaryformatter,.net Core,.net 4.0,Binaryformatter,我有两个程序,一个是用.NETFramework4.7.x编写的,另一个是用.NETCore2.1编写的 程序1,用.Net Framework编写。获取数据集并使用BinaryFormatter将其作为字节[]写入数据库字段 程序2,用dot net core编写,然后获取该记录并尝试使用BinaryFormatter反序列化该字段。我收到一个异常“ArgumentException:类型'System.Byte'不可反序列化。” 计划1 static void Main(string[] a

我有两个程序,一个是用.NETFramework4.7.x编写的,另一个是用.NETCore2.1编写的

程序1,用.Net Framework编写。获取数据集并使用BinaryFormatter将其作为字节[]写入数据库字段

程序2,用dot net core编写,然后获取该记录并尝试使用BinaryFormatter反序列化该字段。我收到一个异常“ArgumentException:类型'System.Byte'不可反序列化。”

计划1

static void Main(string[] args)
    {
        var connectionString = ConfigurationManager.ConnectionStrings["CDPMetadataModelContext"].ConnectionString;
        byte[] binaryFormattedDs;
        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();

            using (var da = new SqlDataAdapter("Select * from Code_Job_Status", connection))
            {
                var ds = new DataSet();
                da.Fill(ds);
                binaryFormattedDs = SerializeBinaryDataContract(ds);
            }
            string query = "INSERT INTO dbo.Result_Cache (Result_Binary_Data, Run_DateTime) output inserted.Result_Cache_ID VALUES";
            string insertQuery = "(@binaryValue, getdate())";
            using (SqlCommand cmd = new SqlCommand(query + insertQuery, connection))
            {
                cmd.Parameters.AddWithValue("@binaryValue", SqlDbType.VarBinary).Value = binaryFormattedDs;                   
                var newId = (int)cmd.ExecuteScalar();
                Console.WriteLine("New Id= "+ newId);
                Debug.WriteLine("New Id= " + newId);
            }
            connection.Close();
        }

        Console.ReadKey();
        var ds2 = DeSerialize<DataSet>(binaryFormattedDs);
        Console.WriteLine("Row Count=" + ds2.Tables[0].Rows.Count);
        Console.ReadKey();
    }

    public static T DeSerialize<T>(byte[] bytes)
    {
        var serializer = new BinaryFormatter();
        using (var ms = new MemoryStream())
        {
            ms.Write(bytes, 0, bytes.Length);
            ms.Seek(0, SeekOrigin.Begin);
            return (T)serializer.Deserialize(ms);
        }

    }

    public static byte[] SerializeBinaryDataContract(DataSet dataSet)
    {

            BinaryFormatter binaryFormatter = new BinaryFormatter();
            byte[] buffer;
            using (MemoryStream memoryStream = new MemoryStream())
            {
                dataSet.RemotingFormat = SerializationFormat.Binary;
                binaryFormatter.Serialize((Stream)memoryStream, (object)dataSet);
                buffer = new byte[memoryStream.Length];
                memoryStream.Seek(0L, SeekOrigin.Begin);
                memoryStream.Read(buffer, 0, buffer.Length);
            }
            return buffer;

    }
static void Main(字符串[]args)
{
var connectionString=ConfigurationManager.connectionString[“CDPMetadatModelContext”]。connectionString;
字节[]二进制格式化的数据;
使用(var连接=新的SqlConnection(connectionString))
{
connection.Open();
使用(var da=new-SqlDataAdapter(“从代码\作业\状态中选择*,连接))
{
var ds=新数据集();
da.填充(ds);
binaryFormattedDs=SerializeBinaryDataContract(ds);
}
string query=“INSERT INTO dbo.Result\u Cache(Result\u Binary\u Data,Run\u DateTime)输出INSERT.Result\u Cache\u ID值”;
string insertQuery=“(@binaryValue,getdate())”;
使用(SqlCommand cmd=newsqlcommand(查询+插入查询,连接))
{
cmd.Parameters.AddWithValue(“@binaryValue”,SqlDbType.VarBinary).Value=binaryFormattedDs;
var newId=(int)cmd.ExecuteScalar();
Console.WriteLine(“新Id=”+newId);
Debug.WriteLine(“新Id=”+newId);
}
connection.Close();
}
Console.ReadKey();
var ds2=反序列化(binaryFormattedDs);
Console.WriteLine(“Row Count=“+ds2.Tables[0].Rows.Count”);
Console.ReadKey();
}
公共静态T反序列化(字节[]字节)
{
var serializer=新的二进制格式化程序();
使用(var ms=new MemoryStream())
{
ms.Write(字节,0,字节.长度);
Seek女士(0,SeekOrigin.Begin);
返回(T)序列化程序。反序列化(ms);
}
}
公共静态字节[]SerializeBinaryDataContract(数据集)
{
BinaryFormatter BinaryFormatter=新的BinaryFormatter();
字节[]缓冲区;
使用(MemoryStream MemoryStream=new MemoryStream())
{
dataSet.RemotingFormat=SerializationFormat.Binary;
序列化((流)内存流,(对象)数据集);
缓冲区=新字节[memoryStream.Length];
memoryStream.Seek(0L,SeekOrigin.Begin);
memoryStream.Read(buffer,0,buffer.Length);
}
返回缓冲区;
}
计划2

 static void Main(string[] args)
    {


        Console.WriteLine("Result_Cache_ID:");
        var reportIds = Console.ReadLine();
        if (int.TryParse(reportIds, out var resultCacheId))
        {

            GetDS(resultCacheId);
        }


        Console.ReadKey();
    }

    private static void GetDS(int resultCacheId)
    {

        using (var connection = new SqlConnection(ConnectionString))
        {
            connection.Open();

            using (var da = new SqlDataAdapter("Select * from Result_Cache where Result_Cache_ID="+ resultCacheId, connection))
            {
                var ds = new DataSet();
                da.Fill(ds);
                var binaryFormattedDs =(byte[]) ds.Tables[0].Rows[0]["Result_Binary_Data"];
                var ds2 = DeSerialize<DataSet>(binaryFormattedDs);
                Console.WriteLine("Row Count=" + ds2.Tables[0].Rows.Count);
            }

        }

    }

    public static T DeSerialize<T>(byte[] bytes)
    {
        var serializer = new BinaryFormatter();
        using (var ms = new MemoryStream())
        {
            ms.Write(bytes, 0, bytes.Length);
            ms.Seek(0, SeekOrigin.Begin);
            return (T)serializer.Deserialize(ms);
        }

    }
static void Main(字符串[]args)
{
Console.WriteLine(“结果缓存ID:”);
var reportIds=Console.ReadLine();
if(int.TryParse(reportid,out var resultCacheId))
{
GetDS(resultCacheId);
}
Console.ReadKey();
}
私有静态void GetDS(int-resultCacheId)
{
使用(var连接=新的SqlConnection(ConnectionString))
{
connection.Open();
使用(var da=new SqlDataAdapter(“从结果缓存中选择*,其中结果缓存ID=“+resultCacheId,connection))
{
var ds=新数据集();
da.填充(ds);
var binaryFormattedDs=(字节[])ds.Tables[0]。行[0][“结果二进制数据”];
var ds2=反序列化(binaryFormattedDs);
Console.WriteLine(“Row Count=“+ds2.Tables[0].Rows.Count”);
}
}
}
公共静态T反序列化(字节[]字节)
{
var serializer=新的二进制格式化程序();
使用(var ms=new MemoryStream())
{
ms.Write(字节,0,字节.长度);
Seek女士(0,SeekOrigin.Begin);
返回(T)序列化程序。反序列化(ms);
}
}

我做错什么了吗

我相信
BinaryFormatter
序列化程序是在同一个系统上进行序列化和反序列化的。我也很确定它在.NETCore中也被弃用了。参见BinaryFormatter,它在2.1中受支持,在github上的Microsofts CoreFx论坛上也有跟踪。我相信
BinaryFormatter
序列化程序旨在在同一系统上进行序列化和反序列化。我也很确定它在.NETCore中也被弃用了。参见BinaryFormatter,它在2.1中受支持,也可以在github上的Microsofts CoreFx论坛上进行跟踪