Have you thought about using the XSD code-gen tools? They can deserialize/serialize and validate via schema orders of magnitude faster than other techniques in C#. You can use partial classes or wrapper classes to add additional fields or object hierarchy for your domain business logic. xsd.exe schema.xsd /classes Some code I lifted from here: http://snipplr.com/view/2660/serializing-and-deserializing-a-class-created-with-xsdexe-using-xml-strings/ public static string SerializeToXmlString(object targetInstance) { string retVal = string.Empty; TextWriter writer = new StringWriter(); XmlSerializer serializer = new XmlSerializer(targetInstance.GetType()); serializer.Serialize(writer, targetInstance); retVal = writer.ToString(); return retVal; } public static object DeserializeFromXmlString(string objectXml, Type targetType) { object retVal = null; XmlSerializer serializer = new XmlSerializer(targetType); StringReader stringReader = new StringReader(objectXml); XmlTextReader xmlReader = new XmlTextReader(StringReader); retVal = serializer.Deserialize(xmlReader); return retVal; } If you can't use XSD.exe (as you imply in your comments) then how about writing a few helper class functions that use XmlDocument.Validate right as you receive or send the messages? http://msdn.microsoft.com/en-us/library/ms162371.aspx You wouldn't really be duplicating validation code if it's a shared component. From their nice example: XmlReaderSettings settings = new XmlReaderSettings(); settings.Schemas.Add("http://www.contoso.com/books", "contosoBooks.xsd"); settings.ValidationType = ValidationType.Schema; XmlReader reader = XmlReader.Create("contosoBooks.xml", settings); XmlDocument document = new XmlDocument(); document.Load(reader); ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler); // the following call to Validate succeeds. document.Validate(eventHandler);