Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.netcore中的二进制格式化程序_.net_Asp.net Core - Fatal编程技术网

.netcore中的二进制格式化程序

.netcore中的二进制格式化程序,.net,asp.net-core,.net,Asp.net Core,.NET framework和.NET core 2.2中的二进制格式化程序兼容性问题 我们现有的代码使用.NET framework 4.0类库(多个项目的公共库)中的BinaryFormatter将字节[]转换为数据集。现在,我们添加了一个新的asp.net core 2.2项目,并尝试使用相同的现有库,幸运的是,我们解决了所有dll问题,但无法调用BinaryFormatter反序列化方法 以下是常见代码: BinaryFormatter oBinaryFormatter

.NET framework和.NET core 2.2中的二进制格式化程序兼容性问题

我们现有的代码使用.NET framework 4.0类库(多个项目的公共库)中的BinaryFormatter将
字节[]
转换为数据集。现在,我们添加了一个新的asp.net core 2.2项目,并尝试使用相同的现有库,幸运的是,我们解决了所有dll问题,但无法调用BinaryFormatter反序列化方法

以下是常见代码:

        BinaryFormatter oBinaryFormatter = new BinaryFormatter();

        using (MemoryStream oMemoryStream = new MemoryStream())
        {
            //Deserialize the byte array into a DataSet and return it to the caller
            oMemoryStream.Write(abData, 0, abData.Length);
            oMemoryStream.Position = 0;
            return (T)(oBinaryFormatter.Deserialize(oMemoryStream));
        }

我无法重现此代码的问题:

var ds=new DataSet();
var table=new DataTable("Moo");
table.Columns.Add("Field1",typeof(string));
table.Columns.Add("Field2",typeof(int));

table.Rows.Add("Value1",1);
ds.Tables.Add(table);
ds.AcceptChanges();
var bf = new BinaryFormatter();

using (var stream=File.OpenWrite("test.bin"))
{
    bf.Serialize(stream,ds);
}

using (var stream2=File.OpenRead("test.bin"))
{
    var ds2=(DataSet)bf.Deserialize(stream2);

    Debug.Assert(ds.Tables[0].TableName==ds2.Tables[0].TableName);
    Debug.Assert(ds.Tables[0].Rows.Count==ds2.Tables[0].Rows.Count);
    Debug.Assert((string)ds2.Tables[0].Rows[0]["Field1"]=="Value1");
    Debug.Assert((int)ds2.Tables[0].Rows[0]["Field2"]==1);

}
查看生成的文件显示包含数据集的架构和XML plus类型元数据,使其比XML文件更详细:

              NSystem.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089   System.Data.DataSet   DataSet.RemotingVersion   XmlSchemaXmlDiffGramSystem.Version            <?xml version="1.0" encoding="utf-16"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Moo">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Field1" type="xs:string" msdata:targetNamespace="" minOccurs="0" />
              <xs:element name="Field2" type="xs:int" msdata:targetNamespace="" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>   ‚<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><NewDataSet><Moo diffgr:id="Moo1" msdata:rowOrder="0"><Field1>Value1</Field1><Field2>1</Field2></Moo></NewDataSet></diffgr:diffgram>   System.Version   _Major_Minor_Build    _Revision           sion           
但是,在.NET4.x中创建一个文件并在.NETCore中读取它还不起作用。甚至还有一个问题还没有解决

由于安全性和兼容性问题而使用。此类可以基于文件内容反序列化任何内容,包括意外或恶意类型。这也是导致兼容性问题的原因-反序列化程序生成了一个新的
System.String
,它与.NET核心运行时的类型不匹配

还有更常见的问题-添加或删除属性可能会导致兼容性问题,因为BinaryFormatter创建的类型与应用程序其余部分使用的类型不匹配。中描述了该问题


我不会屏住呼吸等待跨框架修复。这种类型不受欢迎,积极劝阻,很少使用,这意味着很少有志愿者来修复它。与此同时,核心团队员工面临更高优先级的问题,如gRPC和稳定WinForms和WPF等流行堆栈。

我无法重现此代码的问题:

var ds=new DataSet();
var table=new DataTable("Moo");
table.Columns.Add("Field1",typeof(string));
table.Columns.Add("Field2",typeof(int));

table.Rows.Add("Value1",1);
ds.Tables.Add(table);
ds.AcceptChanges();
var bf = new BinaryFormatter();

using (var stream=File.OpenWrite("test.bin"))
{
    bf.Serialize(stream,ds);
}

using (var stream2=File.OpenRead("test.bin"))
{
    var ds2=(DataSet)bf.Deserialize(stream2);

    Debug.Assert(ds.Tables[0].TableName==ds2.Tables[0].TableName);
    Debug.Assert(ds.Tables[0].Rows.Count==ds2.Tables[0].Rows.Count);
    Debug.Assert((string)ds2.Tables[0].Rows[0]["Field1"]=="Value1");
    Debug.Assert((int)ds2.Tables[0].Rows[0]["Field2"]==1);

}
查看生成的文件显示包含数据集的架构和XML plus类型元数据,使其比XML文件更详细:

              NSystem.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089   System.Data.DataSet   DataSet.RemotingVersion   XmlSchemaXmlDiffGramSystem.Version            <?xml version="1.0" encoding="utf-16"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Moo">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Field1" type="xs:string" msdata:targetNamespace="" minOccurs="0" />
              <xs:element name="Field2" type="xs:int" msdata:targetNamespace="" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>   ‚<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"><NewDataSet><Moo diffgr:id="Moo1" msdata:rowOrder="0"><Field1>Value1</Field1><Field2>1</Field2></Moo></NewDataSet></diffgr:diffgram>   System.Version   _Major_Minor_Build    _Revision           sion           
但是,在.NET4.x中创建一个文件并在.NETCore中读取它还不起作用。甚至还有一个问题还没有解决

由于安全性和兼容性问题而使用。此类可以基于文件内容反序列化任何内容,包括意外或恶意类型。这也是导致兼容性问题的原因-反序列化程序生成了一个新的
System.String
,它与.NET核心运行时的类型不匹配

还有更常见的问题-添加或删除属性可能会导致兼容性问题,因为BinaryFormatter创建的类型与应用程序其余部分使用的类型不匹配。中描述了该问题


我不会屏住呼吸等待跨框架修复。这种类型不受欢迎,积极劝阻,很少使用,这意味着很少有志愿者来修复它。与此同时,核心团队员工面临着更高优先级的问题,如gRPC和稳定WinForms和WPF等流行堆栈。

首先不要使用BinaryFormatter。甚至在.NET4.0时代,出于安全原因,人们都不赞成它。您确定正在正确的运行时上运行吗?请检查,其中还包括一些非常强烈的警告。也就是说,
System.String
是可序列化的,只要它是正确的System.String。BinarySerializer写入和读取完整的类型,包括版本等。您是否尝试读取由4.0生成的内容?顺便问一下,为什么对数据集使用BinaryFormatter?该类型是为了从一开始就序列化为XML而构建的。如果您关心大小,请压缩文件。例如,Word和Excel文件是包含XML文件的ZIP包。它们实际上比不使用压缩的较旧的
doc
xls
格式更小。现在,代码不是序列化数据集所持有的数据,而是序列化数据集的内部结构。任何人都可以建议哪个版本的.net framework BinaryFormatter与.net core 2.2 BinaryFormatter配合使用。我刚才解释过,BinaryFormatter在.net 4.0本身是一个错误的选择。您尝试反序列化的文件来自何处。NET4.0可能吗?您是否仅尝试在.NET Core中序列化和反序列化数据集?我同意,需要将.NET 4.0升级到其最新版本,但这是一个挑战,我们需要找到一些替代方法来解决此问题。我不能说这是我的客户的错误选择。首先不要使用BinaryFormatter。甚至在.NET4.0时代,出于安全原因,人们都不赞成它。您确定正在正确的运行时上运行吗?请检查,其中还包括一些非常强烈的警告。也就是说,
System.String
是可序列化的,只要它是正确的System.String。BinarySerializer写入和读取完整的类型,包括版本等。您是否尝试读取由4.0生成的内容?顺便问一下,为什么对数据集使用BinaryFormatter?该类型是为了从一开始就序列化为XML而构建的。如果您关心大小,请压缩文件。例如,Word和Excel文件是包含XML文件的ZIP包。它们实际上比不使用压缩的较旧的
doc
xls
格式更小。现在,代码不是序列化数据集所持有的数据,而是序列化数据集的内部结构。任何人都可以建议哪个版本的.net framework BinaryFormatter与.net core 2.2 BinaryFormatter配合使用。我刚才解释过,BinaryFormatter在.net 4.0本身是一个错误的选择。您尝试反序列化的文件来自何处。NET4.0可能吗?您是否仅尝试在.NET Core中序列化和反序列化数据集?我同意,需要将.NET 4.0升级到其最新版本,但这是一个挑战,我们需要找到一些替代方法来解决此问题。我不能说这是我的客户的错误选择。