c# - serializar - Conservar el orden de serialización de los miembros en CodeDOM
serialize xsd c# (1)
CodeDOM no tiene ninguna compilación, la forma correcta es agregar XmlAttributes, pero hay un problema con ellos, porque no se juntan con la herencia. Entonces, es mejor emitir las propiedades en el orden correcto, entonces el serializador xml lo serializará en el orden correcto (no está garantizado, pero lo he probado). ¡Espero que funcione! :)
Sé que podemos imponer la generación de los miembros dentro de las clases en el mismo orden que en la colección de miembros como se indica en MSDN . Sin embargo, busco algún código que también agregue un atributo de serialización que proporcione el orden de esos miembros. Así que esto es lo que quiero que el generador cree:
class MyClass
{
[XmlElement("TheProperty", Order = 0]
public int MyProperty { get; set; }
[XmlElement("AnotherProperty", Order = 1]
public int AnotherProperty { get; set; }
}
Actualmente tengo un enfoque que hace un bucle a los miembros de todos los tipos dentro de mi DOM y agrega el atributo a CustomAttributes
miembro de la propiedad o campo actual ( public
).
var types = code.Types.Cast<CodeTypeDeclaration>().Where(x => !x.IsEnum);
foreach (var members in types.Select(x => x.Members.Cast<CodeTypeMember>()))
{
int i = 0;
var propertiesAndFields = members.Where(x => (
x.Attributes & MemberAttributes.Private) != MemberAttributes.Private
&& (x is CodeMemberField || x is CodeMemberProperty));
foreach (CodeTypeMember member in propertiesAndFields)
{
var attr = member.CustomAttributes.Cast<CodeAttributeDeclaration>().FirstOrDefault(x => x.Name == "System.Xml.Serialization.XmlElementAttribute");
if (attr == null)
{
attr = new CodeAttributeDeclaration("System.Xml.Serialization.XmlElementAttribute");
member.CustomAttributes.Add(attr);
}
attr.Arguments.Add(new CodeAttributeArgument("Order", new CodePrimitiveExpression(i++)));
}
}
Sin embargo, esto me parece bastante intrépido y me pregunto si hubo un miembro integrado en CodeDOM que cree los atributos de Order
. Recuerdo que la herramienta Xsd (que quiero ampliar con el comportamiento personalizado usando CodeDOM y que usa las mismas clases e interfaces) es capaz de agregar esos atributos.
EDITAR: el codeDOM se crea usando la clase XmlCodeExporter
y XmlCodeExporter
como se menciona en MSDN :
XmlSchemas schemas = new XmlSchemas();
schemas.Add(schema);
// Create the importer for these schemas.
XmlSchemaImporter importer = new XmlSchemaImporter(schemas);
// System.CodeDom namespace for the XmlCodeExporter to put classes in.
CodeNamespace code = new CodeNamespace(targetNamespace);
XmlCodeExporter exporter = new XmlCodeExporter(code);
// Iterate schema top-level elements and export code for each.
foreach (XmlSchemaElement element in schema.Elements.Values)
{
// Import the mapping first.
XmlTypeMapping mapping = importer.ImportTypeMapping(element.QualifiedName);
// Export the code finally
exporter.ExportTypeMapping(mapping);
}
No puedo ver una manera de proporcionar los atributos de orden aquí, es por eso que quiero configurarlos después de que el DOM ya haya sido creado.