XML序列化大型对象集合

时间:2009-08-20 01:49:22

标签: c# xml serialization

序列化大量对象的最佳方法是什么?我正在尝试序列化并验证一个模式,在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
     }
}

1 个答案:

答案 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);
    }