序列化大量对象的最佳方法是什么?我正在尝试序列化并验证一个模式,在c#中有大约70,000个项目的大量项目。
未创建XML文件。我尝试了1000件物品,它可以用较少的物品工作。
public void SerializeObject( Ojbect MyObj)
{
XmlSerializer serializer = new XmlSerializer(MyObj.GetType());
StreamWriter sw = new StreamWriter(“c:\file.xml”);
serializer.Serialize(streamWriter, myObj);
sw.Flush();
sw.Close();
}
public void Validate()
{
XmlSchema xmlSchema = “c:\myschema.xsd”
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
xmlReaderSettings.ValidationType = ValidationType.Schema;
xmlReaderSettings.Schemas.Add(xmlSchema);
XmlReader xmlReader = XmlReader.Create(xmlStream, xmlReaderSettings);
while (xmlReader.Read())
{
//do some stuff
}
}
答案 0 :(得分:1)
我们对我们正在做的一些工作进行了一些基准测试,发现XmlSerialiser比使用XmlReader更快地处理大型XML文件,但不适用于小型文件。我怀疑XmlValidatingReader可能会很快。您可能需要使用数据样本进行自己的基准测试。
我在网上找到了这个代码,可以对Xml片段进行xsd验证,只需要做一些调整就可以了。
public static bool Validate(string xsd, string xmlFrag)
{
if (string.IsNullOrEmpty(xmlFrag))
return false;
Trace.Indent();
XmlValidatingReader reader = null;
XmlSchemaCollection myschema = new XmlSchemaCollection();
ValidationEventHandler eventHandler = new ValidationEventHandler(ShowCompileErrors);
try
{
//Create the XmlParserContext.
XmlParserContext context = new XmlParserContext(null, null, "", XmlSpace.None);
//Implement the reader.
reader = new XmlValidatingReader(xmlFrag, XmlNodeType.Element, context);
//Add the schema.
myschema.Add("", xsd);
//Set the schema type and add the schema to the reader.
reader.ValidationType = ValidationType.Schema;
reader.Schemas.Add(myschema);
while (reader.Read())
{
}
Trace.WriteLine("Completed validating xmlfragment");
return true;
}
catch (XmlException XmlExp)
{
Trace.WriteLine(XmlExp.Message);
}
catch (XmlSchemaException XmlSchExp)
{
Trace.WriteLine(XmlSchExp.Message);
}
catch (Exception GenExp)
{
Trace.WriteLine(GenExp.Message);
}
finally
{
Trace.Unindent();
}
return false;
}
public static void ShowCompileErrors(object sender, ValidationEventArgs args)
{
Trace.WriteLine("Validation Error: {0}", args.Message);
}