c# - 打开空数据表时 XmlTextReader 中是否存在错误?

标签 c# xml-serialization

在保存不包含任何数据的数据表时,我在使用 C# 中的 XmlSerializer 和 XmlTextReader 时遇到了一些问题。这是一个已知问题吗?是否有解决方法?当使用 XMLSerializer 保存空数据表时,将生成以下 XML:

      <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 is null:

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();

    }
}

最佳答案

(编辑后)

感谢您提供示例代码。是的,我同意这是一个错误。对于变通方法...好吧,您可以默认添加一列吗?为避免交叉污染,您可以使用 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。

关于c# - 打开空数据表时 XmlTextReader 中是否存在错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/689153/

相关文章:

java - 向 Web 服务 Opengts 发送 XML 请求以从 Android 应用程序登录时出错

c# - 如何将变量从一个按钮发送到另一个按钮

c# - Interlocked.Exchange 说明

.net - SGEN、InternalsVisibleTo 和程序集签名

Java:序列化/反序列化到/从 XML 而不是二进制

java - 将 Map 转换为内联元素、文本 XML

c# - XML 文档 (2, 2) 中存在错误。这是什么意思?

c# - 不同的排序顺序 - 分而治之?

c# - DataGridView 使用 SortableBindingList

c# - 发送 Ctrl+C 进行处理