[Mono-bugs] [Bug 685117] New: Binary deserialization of DataTable fails when a data table was added to an other object's SerializationInfo stream
bugzilla_noreply at novell.com
bugzilla_noreply at novell.com
Tue Apr 5 05:48:24 EDT 2011
https://bugzilla.novell.com/show_bug.cgi?id=685117
https://bugzilla.novell.com/show_bug.cgi?id=685117#c0
Summary: Binary deserialization of DataTable fails when a data
table was added to an other object's SerializationInfo
stream
Classification: Mono
Product: Mono: Class Libraries
Version: unspecified
Platform: i586
OS/Version: SLES 10
Status: NEW
Severity: Normal
Priority: P5 - None
Component: CORLIB
AssignedTo: mono-bugs at lists.ximian.com
ReportedBy: mkral at sygnity.pl
QAContact: mono-bugs at lists.ximian.com
Found By: Community User
Blocker: ---
Description of Problem:
Deserialization of DataTable - if the data table was added to an other object's
SerializationInfo - are loosing the original data rows. In the below example
the dataTable.Rows are null after deserialization.
Steps to reproduce the problem:
using System;
using System.IO;
using System.Data;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
class Test
{
static public void Main()
{
var f = new BinaryFormatter();
var m = new MemoryStream();
f.Serialize(m, GetData());
m.Position = 0;
var c = f.Deserialize(m) as DataWrapper;
Console.WriteLine(c.Name);
return;
}
private static DataWrapper GetData() {
DataTable dataTable = new DataTable();
dataTable.Columns.Add("name", typeof(string));
var dr = dataTable.NewRow();
dr["name"] = "anything";
dataTable.Rows.Add(dr);
return new DataWrapper(dataTable.Rows[0]);
}
}
[Serializable]
public class DataWrapper : ISerializable
{
DataRow _dr;
public DataWrapper(DataRow dr)
{
this._dr = dr;
}
protected DataWrapper(SerializationInfo info, StreamingContext context)
{
var table = (DataTable)info.GetValue("dt", typeof(DataTable));
_dr = table.Rows[0];
}
public string Name { get { return _dr["name"].ToString(); } }
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
var dt = _dr.Table;
info.AddValue("dt", dt);
}
}
Actual Results:
Unhandled Exception: System.Reflection.TargetInvocationException: Exception has
been thrown by the target of an invocation. ---> System.NullReferenceException:
Object reference not set to an instance of an object
at DataWrapper..ctor (System.Runtime.Serialization.SerializationInfo info,
StreamingContext context) [0x00000] in <filename unknown>:0
at (wrapper managed-to-native) System.Reflection.MonoCMethod:InternalInvoke
(System.Reflection.MonoCMethod,object,object[],System.Exception&)
at System.Reflection.MonoCMethod.Invoke (System.Object obj, BindingFlags
invokeAttr, System.Reflection.Binder binder, System.Object[] parameters,
System.Globalization.CultureInfo culture) [0x00119] in
/home/webdok/mono/mono-2.10.1/mcs/class/corlib/System.Reflection/MonoMethod.cs:526
--- End of inner exception stack trace ---
at System.Reflection.MonoCMethod.Invoke (System.Object obj, BindingFlags
invokeAttr, System.Reflection.Binder binder, System.Object[] parameters,
System.Globalization.CultureInfo culture) [0x0012c] in
/home/webdok/mono/mono-2.10.1/mcs/class/corlib/System.Reflection/MonoMethod.cs:532
at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[]
parameters) [0x00000] in
/home/webdok/mono/mono-2.10.1/mcs/class/corlib/System.Reflection/MethodBase.cs:96
at System.Runtime.Serialization.ObjectRecord.LoadData
(System.Runtime.Serialization.ObjectManager manager, ISurrogateSelector
selector, StreamingContext context) [0x000fb] in
/home/webdok/mono/mono-2.10.1/mcs/class/corlib/System.Runtime.Serialization/ObjectManager.cs:570
at System.Runtime.Serialization.ObjectManager.DoFixups () [0x00066] in
/home/webdok/mono/mono-2.10.1/mcs/class/corlib/System.Runtime.Serialization/ObjectManager.cs:80
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject
(System.IO.BinaryReader reader) [0x0000f] in
/home/webdok/mono/mono-2.10.1/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:145
at
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph
(BinaryElement elem, System.IO.BinaryReader reader, Boolean readHeaders,
System.Object& result, System.Runtime.Remoting.Messaging.Header[]& headers)
[0x00041] in
/home/webdok/mono/mono-2.10.1/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:110
at
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize
(System.IO.Stream serializationStream,
System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x0007a] in
/home/webdok/mono/mono-2.10.1/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:163
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize
(System.IO.Stream serializationStream) [0x00000] in
/home/webdok/mono/mono-2.10.1/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:120
at Test.Main () [0x00000] in <filename unknown>:0
Expected Results:
the "anything" string on the console.
How often does this happen?
Always.
Additional Information:
Serialization seems to be ok, I've tried to serialize under Mono and
deserialize under ms.net - works fine.
You can workaround this by serializing DataTable to the memory stream and add
that stream to the SerializationInfo object of actually serialized
parent-object.
--
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.
More information about the mono-bugs
mailing list