データを含まないDataTableを保存するときに、XmlSerializerとXmlTextReaderを使用していくつかの問題が発生しています。これは既知の問題ですか?回避策がありますか?空のデータテーブルは、XmlSerializerをを使用して保存されている場合、次のXMLが生成されます。空のデータテーブルを開くときにXmlTextReaderにバグはありますか?
<Values>
<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:MainDataTable="Values" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Values">
<xs:complexType>
</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" />
</Values>
これを含むXMLがリロードされるのXmlTextReaderは静かに失敗し、空のデータテーブルをXMLに書かれている地点を越えてコンテンツをロードしません。この問題は、xs:complexType内にxs:sequence/xs:elementエントリがないことが原因であると考えられます。これはバグですか、もしそうなら、回避策はありますか?
次のC#プログラムは、この問題を示しています。それが出力さDT3が原因上述の問題にnullである:私は、データセットの書き込みのxmlメソッドを使用する傾向がある
public class Data
{
private DataTable dt1;
private DataTable dt2;
private DataTable dt3;
public DataTable Dt1
{
get { return dt1; }
set { dt1 = value; }
}
public DataTable Dt2
{
get { return dt2; }
set { dt2 = value; }
}
public DataTable Dt3
{
get { return dt3; }
set { dt3 = value; }
}
public void TestDataTables()
{
if(dt1 == null)
Console.WriteLine("dt1 is null");
if (dt2 == null)
Console.WriteLine("dt2 is null");
if (dt3 == null)
Console.WriteLine("dt3 is null");
}
}
class Program
{
static void Main(string[] args)
{
// Create test object
Data data = new Data();
data.Dt1 = new DataTable("Test1");
data.Dt1.Columns.Add("Foo");
data.Dt2 = new DataTable("Test2");
// Adding the following line make serialization work as expected
//data.Dt2.Columns.Add("Foo");
data.Dt3 = new DataTable("Test3");
data.Dt3.Columns.Add("Foo");
data.TestDataTables();
// Save to XML
TextWriter filewriter = new StreamWriter("foo.xml");
XmlTextWriter writer = new XmlTextWriter(filewriter);
writer.Formatting = Formatting.Indented;
XmlSerializer s1 = new XmlSerializer(typeof(Data));
s1.Serialize(writer, data);
writer.Close();
filewriter.Close();
// Reload from XML
TextReader filereader = new StreamReader("foo.xml");
XmlTextReader reader = new XmlTextReader(filereader);
XmlSerializer s2 = new XmlSerializer(typeof(Data));
Data newData = s2.Deserialize(reader) as Data;
newData.TestDataTables();
}
}
問題を示す短くて完全なプログラムを投稿してください。生のXMLとXmlTextReaderで読み取るコードです。 XmlTextReaderについて「オブジェクトの読み込み」ではなく、あなたが何を意味するのかは不明です。 –