代码之家  ›  专栏  ›  技术社区  ›  trailmax

正在将数据集序列化为XML-缺少空值的列

  •  0
  • trailmax  · 技术社区  · 8 年前

    我正在集成新系统和旧系统,部分要求是以XML格式写入缓存数据。我已经反编译了遗留系统,并设法尽可能接近需求数据格式。

    这就是遗留系统所做的:

    DataSet formData = getDatasetValuesSomehow();
    
    using (StringWriter stringWriter = new StringWriter())
    {
        formData.WriteXml((TextWriter) stringWriter, XmlWriteMode.DiffGram);
        stringWriter.Flush();
    }
    

    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
        <NewDataSet>
            <VALUES diffgr:id="VALUES1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
                <DEBUG_ID>9141c23e-1149-4ba2-b5d1-5c8c77561f0d</DEBUG_ID>
                <DATECREATED>2018-09-24T15:28:00.3769504+01:00</DATECREATED>
                <DATELASTMODIFIED>2018-09-24T15:28:00.3769504+01:00</DATELASTMODIFIED>
                <CREATEDBY>TRAILMAX</CREATEDBY>
                <LASTMODIFIEDBY>TRAILMAX</LASTMODIFIEDBY>
                <TEXT>Oh MY!</TEXT>
                <DATE>2018-09-24T00:00:00+01:00</DATE>
                <INTEGER>42</INTEGER>
                <KEY1 />
            </VALUES>
        </NewDataSet>
    </diffgr:diffgram>
    

    表示数据库表行中所有值的。注意 <KEY1 /> -这是一个有 null

    当我做同样的事情时(关于如何获取XML),我只得到包含值的字段,没有空字段:

    <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
      <NewDataSet>
        <VALUES diffgr:id="VALUES1" msdata:rowOrder="0" diffgr:hasChanges="inserted">
          <DEBUG_ID>32ac8a83-a45b-473c-9890-d47a4b274426</DEBUG_ID>
          <TEXT>Hello world</TEXT>
          <DATE>2018-09-30T15:16:13.63+01:00</DATE>
        </VALUES>
      </NewDataSet>
    </diffgr:diffgram>
    

    但是表模式是相同的,这里我也应该看到 <键1/> 和 <INTEGER /> 以及其他领域。

    这是我的简历:

    [Test]
    public void Another_Test_ExpectedBehaviour()
    {
        var resultDataSet = new DataSet();
        DataTable values = resultDataSet.Tables.Add("VALUES");
        DataRow valuesRow = values.NewRow();
        var recordId = Guid.NewGuid(); // that's just dummy here - I have a value coming from somewhere
        using (var sqlConnection = new SqlConnection(ConfigurationContext.Current.GetHrnetConnectionstring()))
        {
            sqlConnection.Open();
            var sqlCommand = new SqlCommand("SELECT top 1 * from DEBUG where DEBUG_ID = @1", sqlConnection);
            sqlCommand.Parameters.AddWithValue("@1", recordId);
            using (SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlCommand))
            {
                var dataTable = new DataTable();
                dataAdapter.Fill(dataTable);
    
                var dataRow = dataTable.Rows[0];
                foreach (DataColumn column in dataTable.Columns)
                {
                    string columnName = column.ColumnName;
                    object columnValue = RuntimeHelpers.GetObjectValue(dataRow[columnName, DataRowVersion.Default]);
    
                    values.Columns.Add(columnName, column.DataType);
                    valuesRow[columnName] = columnValue;
                }
            }
        }
        values.Rows.Add(valuesRow);
    
        // Now get XML
        using (StringWriter stringWriter = new StringWriter())
        {
            resultDataSet.WriteXml(stringWriter, XmlWriteMode.DiffGram);
            stringWriter.Flush();
            var xml = stringWriter.ToString();
        }
    }
    

    resultDataSet All the columns are available int the list of columns when inspected in debug

    但是,只有那些有值的才可以通过XML。反序列化时如何在XML中显示空列? https://gist.github.com/trailmax/0100bd6926f311fae277848ce7624e98 -我看不出我在做什么不同,但是它们有空列,我没有。只有它们在.NET3.5上,而我在4.7.1上

    0 回复  |  直到 8 年前