首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何序列化类对象并将其保存到多个XML文件中

如何序列化类对象并将其保存到多个XML文件中
EN

Stack Overflow用户
提问于 2018-03-16 12:24:48
回答 2查看 432关注 0票数 0

我有一个雇员班,如下所示

代码语言:javascript
运行
复制
 public class Employee
    {
        public int EmployeeID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public DateTime DOB { get; set; }
    }

我使用实体框架从数据库中检索员工数据,如下所示

代码语言:javascript
运行
复制
using (var dbContext = new EmployeeEntities())
{
    List<Employee> employeeList = new List<Employee>();
    employeeList = dbContext.employee.Select(x => new Employee
                                        {
                                            EmployeeID = x.EmployeeID,
                                            Name = x.Name,
                                            Age = x.Age,
                                            DOB = x.DOB
                                        }).ToList();
}

然后序列化列表并将其保存为XML文件。

代码语言:javascript
运行
复制
if (employeeList.Count > 0)
{
     XmlSerializer mySerializer = new XmlSerializer(typeof(List<Employee>));
     TextWriter myWriter = new StreamWriter("D:\\Employee.xml", true);
     mySerializer.Serialize(myWriter, employeeList);
     myWriter.Close();
}

这里我的要求是根据我指定的页面大小将结果集保存到多个XML文件中。例如,如果Employee表包含536行,而我的页面大小为100,则应该将其保存在6个XML文件中,分别包含100、100、100、100、100和36行。如何使用实体框架实现这一目标??

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-16 12:36:35

在过去,我使用这个Batch扩展方法来完成这个任务:

代码语言:javascript
运行
复制
public static class EnumerableExtensions
{
    /// <summary> 
    /// Splits the values in an enumerable by position into batches of the specified size 
    /// </summary> 
    public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> items, int batchSize)
    {
        using (var e = items.GetEnumerator())
        {
            while (e.MoveNext()) // check before entering the loop 
            {
                yield return BatchOf(e, batchSize);
            }
        }
    }

    private static IEnumerable<T> BatchOf<T>(IEnumerator<T> e, int batchSize)
    {
        for (var i = 0; i < batchSize; i++)
        {
            if (i > 0 && !e.MoveNext()) // already checked once before entering the loop / so only check on subsequent iterations 
            {
                yield break;
            }
            yield return e.Current;
        }
    }
}

那么它就足够简单了,可以使用:

代码语言:javascript
运行
复制
int i = 0;
foreach (var batch in employeeList.Batch(100))
{
    XmlSerializer mySerializer = new XmlSerializer(typeof(List<Employee>));
    TextWriter myWriter = new StreamWriter($"D:\\Employee{i++}.xml", true);
    mySerializer.Serialize(myWriter, batch.ToList());
    myWriter.Close();
}
票数 0
EN

Stack Overflow用户

发布于 2018-03-16 12:34:59

您可以使用.Skip().Take()来完成这个任务。

.Take()将从列表中获取所定义的项数,如果有较少的项,则将全部取走。.Skip()将跳过定义的金额。

通过拥有tmp变量,您可以关闭employeeList并保存每个文件。

代码语言:javascript
运行
复制
  if (employeeList.Count > 0)
        {
            int take = 100;
            int i = 0;
            while (employeeList.Any())
            {
                i++;
                var tmp = employeeList.Take(take)ToList();
                employeeList = employeeList.Skip(take).ToList();
                XmlSerializer mySerializer = new XmlSerializer(typeof(List<Employee>));
                TextWriter myWriter = new StreamWriter("D:\\Employee"+i+".xml", true);
                mySerializer.Serialize(myWriter, tmp);
                myWriter.Close();
            }
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49320732

复制
相关文章

相似问题

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