2

I'm running a desktop application and when I reach this line:

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

It's throws the following error:

There was an error generating the XML document.

This is the code:

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();
    }

When I debug I see this in the Watch section:

    value.GetType().IsSerializable  true    bool

I'm setting this before declaring values's class:

[Serializable]

Thank you in advance.

Exception detail

            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:

The class:

    [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
}

And this is BELoad (just the fields)

 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; }
}
Jorge
  • 664
  • 1
  • 12
  • 33

3 Answers3

6

There's a hint in the 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.Bitmapis not Xml Serializable, hence the exception. Perhaps another way would be to use XmlIgnoreAttribute to ignore this property, or implement IXmlSerializableand serialize the image as an ascii blob if you really need it saved?

See the related question & answer Serializing a Bitmap in C# to XML

contributed by Conrad Frix in comments

Community
  • 1
  • 1
Dr. Andrew Burnett-Thompson
  • 20,980
  • 8
  • 88
  • 178
2

The Serializable attribute is not related to XML serialization, it's for binary serialization. An object that is serializable with BinaryFormatter isn't always serializable with XmlSerializer...

Thomas Levesque
  • 286,951
  • 70
  • 623
  • 758
0

For XMLSerializer you must have a parameter-less contructor in the class which is getting serialized.

Note that BinaryFormatter and DataContractSerializer do not require this - they can create an uninitialized object out of the ether and initialize it during deserialization.

Manish Basantani
  • 16,931
  • 22
  • 71
  • 103