【发布时间】:2016-05-26 07:25:00
【问题描述】:
我们在 Java 服务器上创建了一个带有“自定义对象和属性”的项目,并且在 C# 客户端上需要这些数据。
例如自定义对象“A”具有属性“B”、“C”。 “B”和“C”都由客户在运行时描述。服务器以 XML 格式将其发送给我们,例如:
<A>
<B> B Data </B>
<C> C Data </C>
</A>
我们创建了一个实现 IXmlSerializable 的类,它读取/写入 xml 以供服务器将自定义属性填充到字典中
public class CustomObject : IXmlSerializable
{
private Dictionary<String, String> attributes;
public void ReadXml(XmlReader reader)
{
attributes = XDocument.Parse(reader.ReadOuterXml()).Root.Elements()
.ToDictionary(xElm => xElm.Name.LocalName, xElm => xElm.Value)
}
// More Serialization logic for IXmlSerializable is here
}
项目很慢,我们想使用更快的 DataContract 序列化。 我们通过在我们的属性(如“B”、“C”)上明确指定硬编码 [DataContract] 来对样本进行测试。然而,在我们的用例中,属性在编译时是未知的。我们可以向服务器查询类型“A”的属性列表。
我们如何将 DataContract 用于运行时定义的属性
【问题讨论】:
-
您可以尝试在您的
CustomObject上实现IExtensibleDataObject,然后使用ExtensionDataObject not marked as serializable 中的技巧提取XML。但是,您是否进行了分析以确定真正的问题出在哪里? -
你为什么要
XDocument.Parse(reader.ReadOuterXml())?这有效地解析了 XML 两次。如果您遇到性能问题,可以将其替换为ReadSubtree()。 -
感谢@dbc 的反馈,XDocument 似乎为每个对象花费了大约 16 毫秒,并且还增加了我们的内存签名。这就是我们需要 DataContract 的原因。我会检查你分享的链接。
-
@dbc 函数中有更多逻辑。我只是为了演示而减少了它。 ReadSubtree() 会提供 XElement 吗? XElement 是我们项目一部分的进一步逻辑所必需的
-
其实
XNode.ReadFrom()会更好。答案已更新。
标签: c# serialization linq-to-xml datacontract ixmlserializable