【问题标题】:C#: Why would an object that implements Serializable wouldn't be possible to serialize?C#:为什么实现 Serializable 的对象无法序列化?
【发布时间】:2012-01-20 15:48:49
【问题描述】:

我正在运行一个桌面应用程序,当我到达这一行时:

serializer.Serialize(new StringWriter(sb), value);

它会引发以下错误:

There was an error generating the XML document.

这是代码:

public static string Serialize(object value)
    {
        var serializer = new XmlSerializer(value.GetType());
        var sb = new StringBuilder();
        serializer.Serialize(new StringWriter(sb), value);
        return sb.ToString();
    }

当我调试时,我在 Watch 部分看到:

    value.GetType().IsSerializable  true    bool

我在声明 values 的类之前设置这个:

[Serializable]

提前谢谢你。

异常详情

            System.InvalidOperationException was unhandled by user code
              Message="There was an error generating the XML document."
              Source="System.Xml"
              StackTrace:
                   at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
                   at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces)
                   at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o)
                   at Pacer.PIA.UI.WindowsForms.Controls.Utility.Serialize(Object value) in E:\Projects\Indexing\Main\Source\Pacer.PIA\Source\Pacer.PIA.UI.WindowsForms\Controls\Utility.cs:line 55
                   at Pacer.PIA.UI.WindowsForms.Controller.MainForm.ActionLoad..ctor(Int32[] index, Object objValue) in E:\Projects\Indexing\Main\Source\Pacer.PIA\Source\Pacer.PIA.UI.WindowsForms\Controller\MainForm\ActionAdd.cs:line 37
                   at Pacer.PIA.UI.WindowsForms.MainForm.SearchLoadByLoadNumber(String loadNumber) in E:\Projects\Indexing\Main\Source\Pacer.PIA\Source\Pacer.PIA.UI.WindowsForms\Forms\MainForm.cs:line 3530
                   at Pacer.PIA.UI.WindowsForms.MainForm.rmedtLoadNumber_KeyPress(Object sender, KeyPressEventArgs e) in E:\Projects\Indexing\Main\Source\Pacer.PIA\Source\Pacer.PIA.UI.WindowsForms\Forms\MainForm.cs:line 1244
                   at Telerik.WinControls.RadItem.OnKeyPress(KeyPressEventArgs e)
                   at Telerik.WinControls.UI.RadTextBoxElement.textBoxItem_KeyPress(Object sender, KeyPressEventArgs e)
                   at Telerik.WinControls.RadItem.OnKeyPress(KeyPressEventArgs e)
                   at Telerik.WinControls.UI.RadTextBoxItem.TextBoxControl_KeyPress(Object sender, KeyPressEventArgs e)
                   at System.Windows.Forms.Control.OnKeyPress(KeyPressEventArgs e)
                   at Telerik.WinControls.UI.RadMaskTextBox.OnKeyPress(KeyPressEventArgs e)
                   at System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
                   at System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
                   at System.Windows.Forms.Control.WmKeyChar(Message& m)
                   at System.Windows.Forms.Control.WndProc(Message& m)
                   at System.Windows.Forms.TextBoxBase.WndProc(Message& m)
                   at System.Windows.Forms.TextBox.WndProc(Message& m)
                   at Telerik.WinControls.UI.HostedTextBoxBase.WndProc(Message& message)
                   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
                   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
                   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
              InnerException: System.InvalidOperationException
                   Message="The type System.Drawing.Bitmap was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically."
                   Source="niumy1xe"
                   StackTrace:
                        at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterBELoadCollection.Write4_Image(String n, String ns, Image o, Boolean isNullable, Boolean needType)
                        at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterBELoadCollection.Write5_BEDocument(String n, String ns, BEDocument o, Boolean isNullable, Boolean needType)
                        at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterBELoadCollection.Write6_BERequirement(String n, String ns, BERequirement o, Boolean isNullable, Boolean needType)
                        at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterBELoadCollection.Write8_BEMove(String n, String ns, BEMove o, Boolean isNullable, Boolean needType)
                        at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterBELoadCollection.Write9_BELoad(String n, String ns, BELoad o, Boolean isNullable, Boolean needType)
                        at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterBELoadCollection.Write10_ArrayOfBELoad(Object o)
                   InnerException:

班级:

    [Serializable]
public class BELoadCollection : List<BELoad>, ICloneable
{
    public BELoad FindByLoadId(string loadId)
    {
        return this.Find(load => load.LoadId.Equals(loadId));
    }

    public bool ExistsByLoadId(string loadId)
    {
        return this.Exists(load => load.LoadId.Equals(loadId));
    }

    public bool HasLoadsWithDocumentRequirementLinked
    {

        get
        {
            return this.Exists(load => load.HasDocumentsRequirementLinked);
        }
    }

    public void PrepareRequirementsToIndex()
    {
        this.ForEach(load =>
        {
            load.PrepareRequirementsToIndex();
        });

    }

    public bool HasLoadsReadyToIndex
    {

        get
        {
            return this.Exists(load => load.HasDocumentsRequirementReadyToIndex);
        }

    }

    public BERequirementCollection GetRequirementsReadyToIndex()
    {
        BERequirementCollection beRequirementsReadyToIndex = new BERequirementCollection();

        this.ForEach(load => beRequirementsReadyToIndex.AddRange(load.GetRequirementsReadyToIndex()));

        return beRequirementsReadyToIndex;
    }

    #region ICloneable Members

    object ICloneable.Clone()
    {
        return this.Clone();
    }

    public BELoadCollection Clone()
    {
        BELoadCollection BELoadCollectionClone = new BELoadCollection();

        for (int i = 0; i <= this.Count - 1; i++)
            BELoadCollectionClone.Add(this[i]);

        return BELoadCollectionClone;
    }

    #endregion
}

这是 BELoad(只是字段)

 public class BELoad : BEMetaData, ICloneable
{
    //Fields
    private BEMoveCollection beMoveCollection;

    public string LoadId { get; set; }
    public string Description { get; set; }
    public string DocumentType { get; set; }
    public string Vendor { get; set; }
    public string VendorCityState { get; set; }
    public string State { get; set; }
    public string EquipmentPrefix { get; set; }
    public string EquipmentNumber { get; set; }
    public string Driver { get; set; }
    public string Shipper { get; set; }
    public string ShipperCityState { get; set; }
    public string BillTo { get; set; }
    public string BillToCityState { get; set; }
    public string Consignee { get; set; }
    public string ConsigneeCityState { get; set; }
    public string Stop { get; set; }
    public string StopCityState { get; set; }
    public string Container { get; set; }
}

【问题讨论】:

  • 任何嵌套类型都可以生成格式错误的 xml 吗?
  • 格式错误的 xml 是什么意思?怎么会这样?
  • 内部异常应该提供更多有用的信息。您能否发布异常的 ToString() 方法的完整结果(包括堆栈跟踪)?
  • 请发布课程- 你读过这个msdn.microsoft.com/en-us/library/…
  • 按照消息中所说的“不期望类型 System.Drawing.Bitmap。使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型。”

标签: c# serialization


【解决方案1】:

stacktrace 中有提示:

InnerException: System.InvalidOperationException                    
    Message="The type System.Drawing.Bitmap was not expected. 
    Use the XmlInclude or SoapInclude attribute to specify types 
    that are not known statically." 

System.Drawing.Bitmap不是 Xml 可序列化的,因此例外。也许另一种方法是使用XmlIgnoreAttribute 忽略此属性,或者实现IXmlSerializable 并将图像序列化为ascii blob,如果您真的需要保存它?

查看相关问答Serializing a Bitmap in C# to XML

由 Conrad Frix 在 cmets 中提供

【讨论】:

  • 这是一个植入你所描述的例子Serialize a Bitmap in C#/.NET to XML
  • @ConradFrix 谢谢 - 如果你把它作为答案,我会 +1 :D
  • 谢谢 :) 但如果您编辑答案可能会更好,因为您的答案可能会成为未来用户会看到的答案。
【解决方案2】:

Serializable 属性与 XML 序列化无关,它用于二进制序列化。可以用BinaryFormatter 序列化的对象并不总是可以用XmlSerializer 序列化...

【讨论】:

    【解决方案3】:

    对于 XMLSerializer,您必须在要序列化的类中有一个无参数构造函数。

    请注意,BinaryFormatter 和 DataContractSerializer 不需要这样做 - 它们可以从以太网中创建一个未初始化的对象并在反序列化期间对其进行初始化。

    【讨论】:

    • 这能回答问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2012-06-17
    • 2018-04-09
    • 2012-02-17
    • 2014-10-06
    • 1970-01-01
    相关资源
    最近更新 更多