I necesidad de construir un conjunto de nodos XML dinámicamente creados a partir de objetos en el siguiente formato:XML Serializar objeto dinámico
<Root>
<Name>My Name</Name>
<DynamicValues>
<DynamicValue1>Value 1</DynamicValue1>
<DynamicValue2>Value 2</DynamicValue2>
</DynamicValues>
</Root>
El nombre de los nodos dentro de la DynamicValues
-tag no se conocen de antemano. Mi pensamiento inicial fue que esto debería ser posible el uso de un Expando Object, por ejemplo:
[DataContract]
public class Root
{
[DataMember]
public string Name { get; set; }
[DataMember]
public dynamic DynamicValues { get; set; }
}
inicializando con los valores:
var root = new Root
{
Name = "My Name",
DynamicValues = new ExpandoObject()
};
root.DynamicValues.DynamicValue1 = "Value 1";
root.DynamicValues.DynamicValue2 = "Value 2";
y luego XML-serializar:
string xmlString;
var serializer = new DataContractSerializer(root.GetType());
using (var backing = new StringWriter())
using (var writer = new XmlTextWriter(backing))
{
serializer.WriteObject(writer, root);
xmlString = backing.ToString();
}
Sin embargo, cuando ejecuto esto, obtengo una SerializationException que dice:
"Escriba 'System.Dynamic.ExpandoObject' con el nombre del contrato de datos 'ArrayOfKeyValueOfstringanyType: http://schemas.microsoft.com/2003/10/Serialization/Arrays' no se espera. Considere el uso de un DataContractResolver o añadir cualquier tipos desconocidos de forma estática a la lista de tipos conocidos -. Por ejemplo, mediante el atributo KnownTypeAttribute o mediante su inclusión en la lista de tipos conocidos pasados a DataContractSerializer "
alguna idea de cómo puedo lograr esto
Efectivamente, es serializar sin lanzar excepciones, pero no en lo que esperaba (véase el ejemplo XML en cuestión). Obtengo nodos del tipo 'KeyValueOfstringanyType'. –
@OlavHaugen, actualicé mi respuesta. –
Funciona muy bien. ¡Gracias! –