Я не могу воспроизвести проблему с этим кодом:
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
Это 1,3 КБ для сохранения 99 байт текста.При написании того же с использованием GZipStream будет получено 82 байта:
using(var gs=new GZipStream(File.OpenWrite("text.gz"),CompressionMode.Compress))
{
ds.WriteXml(gs);
}
Создание файла в .NET 4.x и чтение его в .NET Core пока не работает.Существует даже Github проблема с этим , которая еще не устранена.
Использование BinaryFormatter не рекомендуется из-за проблем безопасности и совместимости.Этот класс может десериализовать все, что угодно, включая непредвиденные или вредоносные типы, в зависимости от содержимого файла.Это также является причиной проблемы совместимости - десериализатор создал новый System.String
, который не соответствует типам среды выполнения .NET Core.
Есть и более обыденные проблемы - добавление или удаление свойства может вызвать проблемы совместимости, потому что тип, созданный BinaryFormatter, не будет соответствовать типу, используемому остальной частью приложения.Эта проблема описана в Version Tolerant Serialization .
Я бы не стал задерживать дыхание в ожидании кросс-каркасного исправления для этого.Этот тип непопулярен, активно не поощряется и редко используется, что означает, что для его исправления будет мало добровольцев.Тем временем сотрудники основной команды имеют более приоритетные проблемы, такие как gRPC и стабилизация популярных стеков, таких как WinForms и WPF.