首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个通用的XML序列化程序,但不使用JObject

一个通用的XML序列化程序,但不使用JObject
EN

Stack Overflow用户
提问于 2013-10-25 16:07:23
回答 1查看 7.3K关注 0票数 3

我有一个将任何对象序列化成xml的函数。

代码语言:javascript
复制
private string ConvertToXml(object obData)
        {
            var x = new System.Xml.Serialization.XmlSerializer(obData.GetType());

            var myStr = string.Empty;
            try
            {
                using (var ms = new MemoryStream())
                {
                    x.Serialize(ms, obData);
                    ms.Position = 0;
                    var sr = new StreamReader(ms);
                    myStr = sr.ReadToEnd();
                    _log.DebugFormat("Converted XML output of record:: {0}", myStr);

                }
            }
            catch (Exception e)
            {
                _log.WarnFormat("Object Conversion to XML Document Failed ..{0} and the obData is: {1}", e.Message,obData) ;
            }

           return myStr;
        }

它适用于我发送的任何类实例。但是,当JObject进入这个函数时,我得到以下错误:

代码语言:javascript
复制
System.InvalidOperationException: You must implement a default accessor on Newtonsoft.Json.Linq.JObject because it inherits from ICollection.
   at System.Xml.Serialization.TypeScope.GetDefaultIndexer(Type type, String memberInfo)
   at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference)
   at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
   at System.Xml.Serialization.ModelScope.GetTypeModel(Type type, Boolean directReference)
   at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace)
   at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
   at System.Xml.Serialization.XmlSerializer..ctor(Type type)
   at CTP.Transformer.XSLT.XSLTTransformer.ConvertToXml(Object obData)

我可以使用JObject序列化程序,但是这个函数将不再是通用的了。

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-25 22:16:35

不幸的是,我看不到一种让XmlSerializerJObject协同工作的简单方法。我建议采取一种单独的方法来处理该案件:

代码语言:javascript
复制
private static string ConvertJObjectToXml(JObject jo, string rootElementName)
{
    XmlDocument doc = JsonConvert.DeserializeXmlNode(jo.ToString(), rootElementName);
    StringBuilder sb = new StringBuilder();
    StringWriter sr = new StringWriter(sb);
    XmlTextWriter xw = new XmlTextWriter(sr);
    xw.Formatting = System.Xml.Formatting.Indented;
    doc.WriteTo(xw);
    return sb.ToString();
}

演示:

代码语言:javascript
复制
JObject jo = new JObject();
jo.Add(new JProperty("foo", "bar"));
jo.Add(new JProperty("fizz", "bang"));

string xml = ConvertJObjectToXml(jo, "root");
Console.WriteLine(xml);

输出:

代码语言:javascript
复制
<root>
  <foo>bar</foo>
  <fizz>bang</fizz>
</root>

如果希望ConvertToXml()方法能够处理所有对象,可以在顶部添加一行,检查obData的类型,并在必要时委托给ConvertJObjectToXml()

代码语言:javascript
复制
private string ConvertToXml(object obData)
{
    if (obData is JObject)
    {
        return ConvertJObjectToXml((JObject)obData, "root");
    }

    // process obData as normal using XmlSerializer
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19594634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档