deserialize c# .net xml serialization dynamic

deserialize xml string to object c#



XML Serialize objeto dinámico (2)

Necesito construir un conjunto de nodos XML creados dinámicamente a partir de objetos en el siguiente formato:

<Root> <Name>My Name</Name> <DynamicValues> <DynamicValue1>Value 1</DynamicValue1> <DynamicValue2>Value 2</DynamicValue2> </DynamicValues> </Root>

El nombre de los nodos dentro de DynamicValues -tag no se conoce de antemano. Mi idea inicial fue que esto debería ser posible utilizando un Objeto Expando , por ejemplo:

[DataContract] public class Root { [DataMember] public string Name { get; set; } [DataMember] public dynamic DynamicValues { get; set; } }

Inicializándolo 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-serializarlo:

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:

"Tipo ''System.Dynamic.ExpandoObject'' con nombre de contrato de datos ''ArrayOfKeyValueOfstringanyType: http://schemas.microsoft.com/2003/10/Serialization/Arrays '' no se espera. Considere usar un DataContractResolver o agregue cualquier tipo que no se conozca estáticamente a la lista de tipos conocidos, por ejemplo, utilizando el atributo KnownTypeAttribute o agregándolos a la lista de tipos conocidos que se pasaron a DataContractSerializer ".

¿Alguna idea de cómo puedo lograr esto?


Intenté esto en vb.net pero no obtuve la salida requerida. Necesitas ayuda.

_ Public Class DynamicSerializable Hereda System.Dynamic.DynamicObject Implements ISerializable

Private ReadOnly dict As New Dictionary(Of String, Object) Public Overrides Function TrySetMember(binder As SetMemberBinder, value As Object) As Boolean If Not dict.ContainsKey(binder.Name) Then dict.Add(binder.Name, value) Else dict(binder.Name) = value End If Return True End Function Public Overrides Function TryGetMember(binder As GetMemberBinder, ByRef result As Object) As Boolean Return dict.TryGetValue(binder.Name, result) End Function Public Sub GetObjectData(info As SerializationInfo, context As StreamingContext) Implements ISerializable.GetObjectData For Each keyValPair In dict info.AddValue(keyValPair.Key, keyValPair.Value) Next End Sub

Clase final

Código utilizado:

Dim root As New Root root.name = "1" root.DynamicValues ​​= New DynamicSerializable

root.DynamicValues.DynamicValue1 = "Value1" root.DynamicValues.DynamicValue2 = "Value1" Dim serializer = New DataContractSerializer(Root.GetType) Dim backing As New StringWriter Dim writer As New XmlTextWriter(backing) serializer.WriteObject(writer, Root)

Salida:


[Serializable] public class DynamicSerializable : DynamicObject, ISerializable { private readonly Dictionary<string, object> dictionary = new Dictionary<string, object>(); public override bool TrySetMember(SetMemberBinder binder, object value) { dictionary[binder.Name] = value; return true; } public void GetObjectData(SerializationInfo info, StreamingContext context) { foreach (var kvp in dictionary) { info.AddValue(kvp.Key, kvp.Value); } } } [KnownType(typeof(DynamicSerializable))] [DataContract] public class Root { [DataMember] public string Name { get; set; } [DataMember] public dynamic DynamicValues { get; set; } }

Salida:

<Program.Root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http:// schemas.datacontract.org/2004/07/"> <DynamicValues i:type="Program.DynamicSerializable"> <DynamicValue1 xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:st ring" xmlns="">Value 1</DynamicValue1> <DynamicValue2 xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:st ring" xmlns="">Value 2</DynamicValue2> </DynamicValues> <Name>My Name</Name> </Program.Root>