[Mono-bugs] [Bug 576520] New: DataTable.WriteXml has a wrong behavior when using a column of type "object".
bugzilla_noreply at novell.com
bugzilla_noreply at novell.com
Wed Feb 3 09:29:36 EST 2010
http://bugzilla.novell.com/show_bug.cgi?id=576520
http://bugzilla.novell.com/show_bug.cgi?id=576520#c0
Summary: DataTable.WriteXml has a wrong behavior when using a
column of type "object".
Classification: Mono
Product: Mono: Class Libraries
Version: SVN
Platform: All
OS/Version: All
Status: NEW
Severity: Major
Priority: P5 - None
Component: Sys.Data
AssignedTo: mono-bugs at lists.ximian.com
ReportedBy: gsirou at secway.fr
QAContact: mono-bugs at lists.ximian.com
Found By: ---
Blocker: ---
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)
AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.78 Safari/532.5
Excepted behavior:
When using a column of type "object" in a DataTable, WriteColumnAsElement
should check if the object instance implements IXmlSerializable then call the
object WriteXml method. Otherwise, an InvalidOperationException must be thrown.
Actual behavior:
WriteXmlObject is called, leading to a <object>.ToString().
Reproducible: Always
Steps to Reproduce:
1. Compile the code in the "Additional Information" section
2. Launch it on MS .NET
3. Launch it with Mono
Actual Results:
<DocumentElement>
<myTable>
<classA>
<!--OK, WriteXml used-->
</classA>
<AnObject>ERROR, ToString used</AnObject>
<AFloat>3.14</AFloat>
<AString>hello</AString>
</myTable>
<myTable>
<classA>
<!--OK, WriteXml used-->
</classA>
<AnObject>ERROR, ToString used</AnObject>
<AFloat>6</AFloat>
<AString>hello2</AString>
</myTable>
</DocumentElement>
Expected Results:
<DocumentElement>
<myTable>
<classA>
<!--OK, WriteXml used-->
</classA>
<AnObject msdata:InstanceType="MonoBug.A, MonoBug, Version=1.0.0.0,
Culture=
neutral, PublicKeyToken=null"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata
">
<!--OK, WriteXml used-->
</AnObject>
<AFloat>3.14</AFloat>
<AString>hello</AString>
</myTable>
<myTable>
<classA>
<!--OK, WriteXml used-->
</classA>
<AnObject msdata:InstanceType="MonoBug.A, MonoBug, Version=1.0.0.0,
Culture=
neutral, PublicKeyToken=null"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata
">
<!--OK, WriteXml used-->
</AnObject>
<AFloat>6</AFloat>
<AString>hello2</AString>
</myTable>
</DocumentElement>
Sample code:
------------------------------------------------------------------------
using System;
using System.Xml.Serialization;
using System.Data;
namespace MonoBug {
public class A : IXmlSerializable {
public System.Xml.Schema.XmlSchema GetSchema() {
return null;
}
public void ReadXml(System.Xml.XmlReader reader) {
}
public void WriteXml(System.Xml.XmlWriter writer) {
writer.WriteComment("OK, WriteXml used");
}
public override string ToString() {
return "ERROR, ToString used";
}
}
class Program {
static void Main(string[] args) {
DataTable dt = new DataTable("myTable");
dt.Columns.Add("classA", typeof(A));
dt.Columns.Add("AnObject", typeof(object));
dt.Columns.Add("AFloat", typeof(float));
dt.Columns.Add("AString", typeof(string));
dt.Rows.Add(new object[] { new A(), new A(), 3.14f, "hello" });
dt.Rows.Add(new object[] { new A(), new A(), 6.00f, "hello2" });
dt.WriteXml(Console.Out);
Console.ReadLine();
}
}
}
------------------------------------------------------------------------
Patch: (class/System.Data/System.Data/DataSet.cs diff)
------------------------------------------------------------------------
1408c1408,1418
< writer.WriteString (WriteObjectXml (rowObject));
---
> if (col.DataType == typeof(object)) {
> IXmlSerializable serializableObject = rowObject as IXmlSerializable;
> if (serializableObject == null)
> throw new InvalidOperationException();
>
> writer.WriteAttributeString("xmlns", "msdata", null, "urn:schemas-microsoft-com:xml-msdata");
> writer.WriteAttributeString("InstanceType", "urn:schemas-microsoft-com:xml-msdata", serializableObject.GetType().AssemblyQualifiedName);
> serializableObject.WriteXml(writer);
> } else {
> writer.WriteString (WriteObjectXml (rowObject));
> }
------------------------------------------------------------------------
--
Configure bugmail: http://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