2009-03-27 8 views
2

データを含まない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(); 

    } 
} 
+0

問題を示す短くて完全なプログラムを投稿してください。生のXMLとXmlTextReaderで読み取るコードです。 XmlTextReaderについて「オブジェクトの読み込み」ではなく、あなたが何を意味するのかは不明です。 –

答えて

0

コード例について

感謝。はい、私はこれがバグであることに同意します。回避策としては...デフォルトでは列を追加できますか?交差汚染を避けるために、あなたはShouldSerialize*を使用することができます。

public bool ShouldSerializeDt1() { 
    return dt1 != null && dt1.Columns.Count > 0; 
} 
public bool ShouldSerializeDt2() { 
    return dt2 != null && dt2.Columns.Count > 0; 
} 
public bool ShouldSerializeDt3() { 
    return dt3 != null && dt3.Columns.Count > 0; 
} 

少なくともそれが省略されますDT2、DT3の代わりです。

+0

問題点を示すコードサンプルが含まれています。上記のC#プログラムはdt3がヌルです。 dt2に列を追加すると、dt1、dt2、およびdt3を正しくシリアル化できます。 – Bardsley

0

私は、MSDNフォーラム上で、このクエリを掲載している:

をどのようにセッションに空のDataTableをシリアル化することができますか? http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataset/thread/4704d53c-ca3a-4da1-8257-b2b05c2e9e32

私はここに新しいトピックを投稿する前に、これは、あなたがここに報告されているのと同じ問題にしてくださいますか? 明示的なSeializationを使用していないため、わかりません。セーブ/リストアされたセッションにDataSet(行がないDataTableを含む)を配置しています。

関連する問題