From 99c975d781f5135e71443c1f108fb4d7a56823fe Mon Sep 17 00:00:00 2001 From: Anipik Date: Tue, 20 Feb 2018 11:43:52 -0800 Subject: [PATCH 1/3] Serialization of dataType Corrected --- .../src/System/Data/DataTable.cs | 6 +++--- .../tests/System/Data/DataTableTest.cs | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/System.Data.Common/src/System/Data/DataTable.cs b/src/System.Data.Common/src/System/Data/DataTable.cs index 7da6e969c231..0d3cd545780d 100644 --- a/src/System.Data.Common/src/System/Data/DataTable.cs +++ b/src/System.Data.Common/src/System/Data/DataTable.cs @@ -372,8 +372,7 @@ internal void SerializeTableSchema(SerializationInfo info, StreamingContext cont info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.DefaultValue", i), Columns[i].DefaultValue); info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.ReadOnly", i), Columns[i].ReadOnly); info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.MaxLength", i), Columns[i].MaxLength); - info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.DataType", i), Columns[i].DataType); - + info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.DataType", i), Columns[i].DataType.AssemblyQualifiedName); info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.XmlDataType", i), Columns[i].XmlDataType); info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.SimpleType", i), Columns[i].SimpleType); @@ -442,7 +441,8 @@ internal void DeserializeTableSchema(SerializationInfo info, StreamingContext co dc._columnUri = info.GetString(string.Format(formatProvider, "DataTable.DataColumn_{0}.Namespace", i)); dc.Prefix = info.GetString(string.Format(formatProvider, "DataTable.DataColumn_{0}.Prefix", i)); - dc.DataType = (Type)info.GetValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.DataType", i), typeof(Type)); + string typeName = (string)info.GetValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.DataType", i), typeof(string)); + dc.DataType = Type.GetType(typeName); dc.XmlDataType = (string)info.GetValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.XmlDataType", i), typeof(string)); dc.SimpleType = (SimpleType)info.GetValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.SimpleType", i), typeof(SimpleType)); diff --git a/src/System.Data.Common/tests/System/Data/DataTableTest.cs b/src/System.Data.Common/tests/System/Data/DataTableTest.cs index 92f507d88a8a..470caf57d804 100644 --- a/src/System.Data.Common/tests/System/Data/DataTableTest.cs +++ b/src/System.Data.Common/tests/System/Data/DataTableTest.cs @@ -32,6 +32,7 @@ using System.Diagnostics; using System.Globalization; using System.IO; +using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Tests; using System.Xml; using Xunit; @@ -388,6 +389,25 @@ public void SelectOperators() } + [Fact] + public void DataColumnTypeSerialization() + { + DataTable dt = new DataTable("MyTable"); + DataColumn dc = new DataColumn("dc", typeof(Int32)); + dt.Columns.Add(dc); + dt.RemotingFormat = SerializationFormat.Binary; + + DataTable dtDeserialized; + using (MemoryStream ms = new MemoryStream()) + { + BinaryFormatter bf = new BinaryFormatter(); + bf.Serialize(ms, dt); + ms.Seek(0, SeekOrigin.Begin); + dtDeserialized = (DataTable)bf.Deserialize(ms); + } + Assert.Equal(dc.DataType.ToString(), dtDeserialized.Columns[0].DataType.ToString()); + } + [Fact] public void SelectExceptions() { From b9b9ad146fca43a4b28b7cd23c64968409daebde Mon Sep 17 00:00:00 2001 From: Anipik Date: Tue, 20 Feb 2018 13:31:19 -0800 Subject: [PATCH 2/3] throw exception if type not resolvable --- src/System.Data.Common/src/System/Data/DataTable.cs | 2 +- src/System.Data.Common/tests/System/Data/DataTableTest.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/System.Data.Common/src/System/Data/DataTable.cs b/src/System.Data.Common/src/System/Data/DataTable.cs index 0d3cd545780d..c240bd9afe75 100644 --- a/src/System.Data.Common/src/System/Data/DataTable.cs +++ b/src/System.Data.Common/src/System/Data/DataTable.cs @@ -442,7 +442,7 @@ internal void DeserializeTableSchema(SerializationInfo info, StreamingContext co dc.Prefix = info.GetString(string.Format(formatProvider, "DataTable.DataColumn_{0}.Prefix", i)); string typeName = (string)info.GetValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.DataType", i), typeof(string)); - dc.DataType = Type.GetType(typeName); + dc.DataType = Type.GetType(typeName, throwOnError: true); dc.XmlDataType = (string)info.GetValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.XmlDataType", i), typeof(string)); dc.SimpleType = (SimpleType)info.GetValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.SimpleType", i), typeof(SimpleType)); diff --git a/src/System.Data.Common/tests/System/Data/DataTableTest.cs b/src/System.Data.Common/tests/System/Data/DataTableTest.cs index 470caf57d804..605b1e1b801c 100644 --- a/src/System.Data.Common/tests/System/Data/DataTableTest.cs +++ b/src/System.Data.Common/tests/System/Data/DataTableTest.cs @@ -393,7 +393,7 @@ public void SelectOperators() public void DataColumnTypeSerialization() { DataTable dt = new DataTable("MyTable"); - DataColumn dc = new DataColumn("dc", typeof(Int32)); + DataColumn dc = new DataColumn("dc", typeof(int)); dt.Columns.Add(dc); dt.RemotingFormat = SerializationFormat.Binary; @@ -405,7 +405,7 @@ public void DataColumnTypeSerialization() ms.Seek(0, SeekOrigin.Begin); dtDeserialized = (DataTable)bf.Deserialize(ms); } - Assert.Equal(dc.DataType.ToString(), dtDeserialized.Columns[0].DataType.ToString()); + Assert.Equal(dc.DataType, dtDeserialized.Columns[0].DataType); } [Fact] From cbba9251649ba2150854cdbd4fe30e495c2fe964 Mon Sep 17 00:00:00 2001 From: Anipik Date: Tue, 20 Feb 2018 20:18:34 -0800 Subject: [PATCH 3/3] Change Serialization info key --- src/System.Data.Common/src/System/Data/DataTable.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/System.Data.Common/src/System/Data/DataTable.cs b/src/System.Data.Common/src/System/Data/DataTable.cs index c240bd9afe75..8ffc38539ade 100644 --- a/src/System.Data.Common/src/System/Data/DataTable.cs +++ b/src/System.Data.Common/src/System/Data/DataTable.cs @@ -372,7 +372,7 @@ internal void SerializeTableSchema(SerializationInfo info, StreamingContext cont info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.DefaultValue", i), Columns[i].DefaultValue); info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.ReadOnly", i), Columns[i].ReadOnly); info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.MaxLength", i), Columns[i].MaxLength); - info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.DataType", i), Columns[i].DataType.AssemblyQualifiedName); + info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.DataType_AssemblyQualifiedName", i), Columns[i].DataType.AssemblyQualifiedName); info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.XmlDataType", i), Columns[i].XmlDataType); info.AddValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.SimpleType", i), Columns[i].SimpleType); @@ -441,7 +441,7 @@ internal void DeserializeTableSchema(SerializationInfo info, StreamingContext co dc._columnUri = info.GetString(string.Format(formatProvider, "DataTable.DataColumn_{0}.Namespace", i)); dc.Prefix = info.GetString(string.Format(formatProvider, "DataTable.DataColumn_{0}.Prefix", i)); - string typeName = (string)info.GetValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.DataType", i), typeof(string)); + string typeName = (string)info.GetValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.DataType_AssemblyQualifiedName", i), typeof(string)); dc.DataType = Type.GetType(typeName, throwOnError: true); dc.XmlDataType = (string)info.GetValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.XmlDataType", i), typeof(string)); dc.SimpleType = (SimpleType)info.GetValue(string.Format(formatProvider, "DataTable.DataColumn_{0}.SimpleType", i), typeof(SimpleType));