【问题标题】:Why doesn't XmlSerializer serialize my array?为什么 XmlSerializer 不序列化我的数组?
【发布时间】:2011-03-30 15:53:56
【问题描述】:

我是 XmlSerializer 的新手。我写了一个小类来保存数据库中的条目:

[Serializable]
public struct Entry
{
    public string artkey, lid, request, status, requestdate;
}

够简单吧?序列化这些列表应该是小菜一碟。

我有一个编译这些列表的函数。为了序列化我的列表,我尝试了以下代码:

XmlSerializer serializer = new XmlSerializer(typeof(Entry));
System.IO.MemoryStream ms = new System.IO.MemoryStream();
serializer.Serialize(ms, entries.ToArray());
ms.WriteTo(Response.OutputStream);

此代码打印以下异常:

<error>System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidCastException: Specified cast is not valid.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterEntry.Write3_Entry(Object o)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
   at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o, XmlSerializerNamespaces namespaces)
   at System.Xml.Serialization.XmlSerializer.Serialize(Stream stream, Object o)
   at CCB_Requests.xmlResponse_selectFromCcb_Requests(HttpResponse response)
   at CCB_Requests.ProcessRequest(HttpContext context)</error>

看来我一定是犯了一个简单的错误。我该如何解决这个问题?

【问题讨论】:

  • 顺便说一句,公共领域:不好;可变结构:不好;实体的结构:不好......这应该是一个具有属性的类
  • 哦,[Serializable] 不会影响 XML 序列化。但是底部的右大括号很好:)
  • 如果这是一个有属性的类会更好吗?
  • struct 在 c# 中并不意味着“基本对象”;它有一个非常具体的含义,不是这个。可变结构臭名昭著会导致奇怪的数据问题,人们不太期待它们的复制语义。它也是超大的对于小值,结构是有效的;这有多个参考。公共字段打破了所有封装和抽象的规则。我需要继续!
  • 扭转这个问题;如果您不能清楚地 说明它为什么是结构,则默认为类。在 c# 中使用 stuct 是一个常见的错误,因为类型是“简单的”,但这与 struct 的真正使用相去甚远,坦率地说,我我不得不回答很多“为什么这不像我期望的那样工作?” “因为那真的不应该是一个结构”。老实说,那应该是一堂课。

标签: .net xml xmlserializer


【解决方案1】:

您正在序列化Entry数组,请将XmlSerializer 的初始化更改为:

// typeof(Entry) ==> typeof(Entry[])
XmlSerializer serializer = new XmlSerializer(typeof(Entry[]));

【讨论】:

  • 您的答案消除了异常,但结果只是所有数据库条目的拼贴,没有 XML 标记。我是否需要在我的类上添加一些属性才能使其工作?
  • 哦,把最后一条评论划掉。我只是看不到 XML 标记,因为我在将其解释为 HTML 的浏览器中查看它!
【解决方案2】:

将其写为 wiki,因为它不回答问题,但显示应如何编写此类型:

public class Entry
{
    [XmlElement("artKey")]
    public string ArtKey {get;set;}

    // etc
}

原因,请参阅我添加到问题中的 cmets

【讨论】:

    【解决方案3】:

    有时不要使用 typeof(),如果您的 Entry 为 Null 或处于故障状态,那么它会显示 InvalidCastException,因此除了使用 GetType() 方法之外,它会为您提供与 typeof() 相同的输出。

       Entry e = new Entry();
                e.artkey = "as";
                e.lid = "lid";
                e.request = "request";
                e.requestdate = "req  uesteddate";
                e.GetType();
        try(e!=null)
        {
             XmlSerializer serializer = new XmlSerializer(e.GetType());
        }
    

    【讨论】:

      猜你喜欢
      • 2014-08-28
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多