首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将DataTable (数据集)序列化为对象

将DataTable (数据集)序列化为对象
EN

Stack Overflow用户
提问于 2013-12-09 07:01:45
回答 1查看 2.4K关注 0票数 0

我从数据库中有一个类和一个查询,在DataSet中填充DataSet。我想用来自DataTable & DataSet的数据填充对象。我怎样才能做到呢?

目的:

代码语言:javascript
复制
 public class Marks
    {
        public List<Mark> MarkList { get; set; }

        public Marks()
        {
            MarkList = new List<Mark>();
        }
    }


    public class Mark
    { 
        public String Number { get; set; }

        public String Word { get; set; }

        public DateTime? DateIn { get; set; }

        public DateTime? DateOut { get; set; }
    }

我试过这样做:

代码语言:javascript
复制
private void BindMarksSerialize()
{      
    FillDataTable(dtMarks, MarksCMD);

    MemoryStream stream = new MemoryStream();
    dtMarks.WriteXml(stream);
    XmlSerializer serializer = new XmlSerializer(typeof(Marks), new XmlRootAttribute("Marks")); 
    File.WriteAllBytes("C:\\Out.xml", stream.ToArray());


    StreamReader reader = new StreamReader("C:\\Out.xml");
    var marks = (Marks)serializer.Deserialize(reader);
    reader.Close();
}

private void FillDataTable(DataTable dataTable, Object sqlCommandContainer)
{
    var sqlCommand = sqlCommandContainer as SqlCommand;
    var sqlDataAdapter = sqlCommandContainer as SqlDataAdapter;
    if (sqlDataAdapter == null && sqlCommand == null)
        return;

        dataTable.Clear();
        if (sqlCommand != null)
        {
            sqlCommand.Connection.Open();
            dataTable.Load(sqlCommand.ExecuteReader());
        }
        else
            sqlDataAdapter.Fill(dataTable);
 }

需要得到填充XML的结果:

代码语言:javascript
复制
<Marks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <MarkList>
    <Mark>
      <Number>1</Number>
      <Word>123123123</Word>
      <DateIn xsi:nil="true" />
      <DateOut xsi:nil="true" />      
    </Mark>
  </MarkList>
</Marks>

我得到了:

代码语言:javascript
复制
<NewDataSet>
  <Mark>
    <Number>110938</Number>
    <Word>110938</Word>
    <DateIn>1993-04-08T00:00:00+05:00</DateIn>
    <DateOut>2002-02-04T00:00:00+04:00</DateOut>    
  </Mark>
</NewDataSet>

提示符有人知道怎么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-09 08:15:15

如果我正确地理解了您的问题,那么您在将DataSet写入XML文件时遇到了困难,但是编写标记类类型对象的列表没有问题。

您可以使用反射创建一个可重用的函数,该函数将从任何Datatable中读取Datarow,并将其分配给作为参数传递的任何对象。如果您想要该对象的列表,那么可以遍历DataRows of DataTable。在下面的示例中,我将从一行生成一个对象。(这是一种可重用的映射。)

代码语言:javascript
复制
public static object ConvertDataRowToObject(object Object, DataTable DataTable)
{
    try
    {
        if (DataTable.Rows.Count > 0)
        {
            DataRow DataRow = DataTable.AsEnumerable().FirstOrDefault();
            if (DataRow != null)
            {
                Type ObjectType = Object.GetType();
                //Get public properties
                System.Reflection.PropertyInfo[] _propertyInfo =
                     ObjectType.GetProperties();
                foreach (System.Reflection.PropertyInfo _property in _propertyInfo)
                {
                    _property.SetValue(Object, (DataRow[_property.Name.ToString()] is System.DBNull ? null : DataRow[_property.Name.ToString()]), null);
                }
                return Object;
            }
            else return null;
        }
        else
            return null;
    }
    catch (Exception excp)
    {
        Common.WriteErrorLog(excp.Message);
        return null;
    }
}

现在,当我需要调用这个静态可重用函数时,我可以像这个示例那样做。

代码语言:javascript
复制
Database _dbFactory = Common.Database;
                DataSet dset = new DataSet();
                Object[] _dbObject = DataBaseHelper.CreateConnection();
                dset = _dbFactory.ExecuteDataSet("Jwl_sp_SearchByProductCategoryById", new object[] { _Id });
                DataBaseHelper.CloseConnection((SqlConnection)_dbObject[0]);
                DataTable dt = new DataTable();
                dt = dset.Tables[0];
                var objectTobeConverted = new DataLogic.Database.Jwl_ByProductCategory();
                ConvertDataRowToObject(objectTobeConverted, dt);

我使用Javascript序列化程序序列化了这个对象。在您的示例中,下一步是编写一个可以使用xmlSerialization的xml文档,否则我建议使用XMLWriter。

代码语言:javascript
复制
public static string GetJSONSerializedObject(object myItem)
{
    try
    {
        if (myItem != null)
        {
            List<KeyValuePair<string, string>> _propList = new List<KeyValuePair<string, string>>();

            Type myObjectType = myItem.GetType();
            //Get public properties
            System.Reflection.PropertyInfo[] _propertyInfo =
                 myObjectType.GetProperties();
            foreach (System.Reflection.PropertyInfo _property in _propertyInfo)
            {
                string _key = String.Empty;
                string _value = String.Empty;
                _key = _property.Name.ToString();
                _value = (_property.GetValue(myItem, null) != null) ? Convert.ToString(_property.GetValue(myItem, null)) : "";
                _propList.Add(new KeyValuePair<string, string>(_key, _value));
            }
            if (_propList.Count > 0)
            {// Serializing an object's properties
               System.Web.Script.Serialization.JavaScriptSerializer jsSerializer;
                jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
                System.Text.StringBuilder _strBuild = new System.Text.StringBuilder();
                jsSerializer.Serialize(_propList, _strBuild);
                return _strBuild.ToString();


            }
            else { return null; }
        }
        else { return null; }
    }
    catch (Exception excp)
    {
        Common.WriteErrorLog(excp.Message);
        return null;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20464947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档