[英]XML Serialize dynamic object
我需要使用以下格式从对象构造一组动态创建的XML节点:
<Root>
<Name>My Name</Name>
<DynamicValues>
<DynamicValue1>Value 1</DynamicValue1>
<DynamicValue2>Value 2</DynamicValue2>
</DynamicValues>
</Root>
DynamicValues
-tag中的节点名称不是事先知道的。 我最初的想法是,这应该可以使用Expando对象 ,例如:
[DataContract]
public class Root
{
[DataMember]
public string Name { get; set; }
[DataMember]
public dynamic DynamicValues { get; set; }
}
通过使用值初始化它:
var root = new Root
{
Name = "My Name",
DynamicValues = new ExpandoObject()
};
root.DynamicValues.DynamicValue1 = "Value 1";
root.DynamicValues.DynamicValue2 = "Value 2";
然后Xml-serialize它:
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();
}
但是,当我运行它时,我得到一个SerializationException说:
“类型'System.Dynamic.ExpandoObject'与数据契约名称'ArrayOfKeyValueOfstringanyType: http : //schemas.microsoft.com/2003/10/Serialization/Arrays '不是预期的。请考虑使用DataContractResolver或添加任何静态未知的类型已知类型的列表 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。
我有什么想法可以达到这个目的吗?
[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; }
}
输出:
<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>
在vb.net中尝试过但没有得到所需的输出。 需要帮忙。
_ Public Class DynamicSerializable Inherits System.Dynamic.DynamicObject实现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
结束班
使用的代码:
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)
输出:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.