2011-04-19 46 views
0

我已搜查甚广,并没有能够找到一个解决我的问题。XML序列化,它处理如何写出一个文件

我有一个典型的情况,其中的过程是逐步蚕食内存。该进程最终抛出OutofMemory异常。过去只是建立一个具有更大内存的特殊机器来解决这个问题。

这个过程只对我们的客户有炸弹,这个客户有大约450,000条记录。我们迭代帐户的集合并构建一个类对象,然后将其传递给xml序列化程序。这个对象有几个属性和方法不会同时被填充。这些对象根据每个帐户记录中的信息填充。

我已经检查过我们为XML序列化程序调用构造函数的方式,它的格式是存储xml程序集并且不会每次都创建新程序集。所以,我不相信由于创建动态程序集而导致内存泄漏。

我们怎么叫串行:昏暗k1Serializer作为新的XmlSerializer(的GetType(ClassObject))

我的问题是:

当序列化大对象,确实串行看看每一个可能的序列化对象或只是那些由你的对象填充的那些?

这个大类对象的序列化是否会导致问题?

我注意到当我们传入序列化对象时,它不会自动写出到指定的文件中。我猜想,需要几秒钟,序列化对象,然后写出来。实际上,我们正在迭代这么多记录,这么快,序列化程序没有足够的时间写出文件并释放内存?

我真的在我的智慧结束,任何帮助将不胜感激。请让我知道是否需要其他信息。

感谢

+0

可以显示更多的实际的代码,说明你如何调用序列化,和你有什么序列化到* *。 – Cheeso 2011-04-21 20:34:43

回答

0

加载45万个记录在同一时间内存只是写出来到一个XML文件不看是一个好主意,我。我建议你重新设计使用XMLWriter的,而不是XML序列化,这样整套的信息不必在同一时间保存在内存中的功能。

+0

我们通过这些对象提供必要的数据填充它们,然后使每个对象转换成XML序列450,000的记录加载到对象的数组,然后循环。对不起,如果我没有在第一篇文章中说清楚。 – user715984 2011-04-20 18:44:50

-1

考虑看看XmlTextWriter。您可以手动写出来的XML数据为你的数据,而不诉诸是XmlSerializer的黑盒。

通过项目列表迭代,写出来到一个XML文件一个简单的例子:

var settings = new System.Xml.XmlWriterSettings 
{ 
    OmitXmlDeclaration = true, 
    Indent= true 
};  
string myXmlNamespace = "urn:myXmlNamespace"; 
using (var fileStream = 
    new FileStream("MyFile.xml", FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    using (XmlWriter w = XmlWriter.Create(fileStream, settings)) 
    { 
    w.WriteStartElement("root", myXmlNamespace); 
    for (var elt in myCollection) 
    { 
     w.WriteStartElement("elt",myXmlNamespace); 
     w.WriteElementString("prop1",myXmlNamespace,elt.Property1); 
     w.WriteElementString("prop2",myXmlNamespace,elt.Property2); 
     w.WriteEndElement(); 
    } 
    } 
} 

你不得不做“反序列”相反。打开文件流,然后使用XmlTextReader()读取XML,并实例化要添加到集合中的元素。

+0

-1否,使用'XmlWriter.Create'。从.NET 2.0开始,XmlTextWriter已被弃用。 – 2011-04-21 20:24:12

+0

啊,好吧。我现在记得那个。在我的辩护中,XmlTextWriter的文档页面仍然使用构造函数显示示例。 – Cheeso 2011-04-21 20:26:33

+0

我们使用XmlWriter传入XML序列化程序。我们使用序列化程序,因为我们必须填充许多对象,并且我觉得重写整个过程以使用XmlWriter并不是一个好的解决方案。我们计划在未来稍后重写我们的流程。开始使用XML序列器是一个糟糕的选择。通过使用序列化程序,我不必担心每次写出startelement,endelement等。 – user715984 2011-04-21 20:28:01