开发者

XML serialization problem in C# ASP.NET

i keep getting this error:

Exception Details: System.NotSupportedException: Cannot serialize member HannaPrintsDataAccess.Customer.CustomerAddresses of type System.Collections.Generic.IList`1[[HannaPrintsDataAccess.CustomerAddress, HannaPrintsDataAccess, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] because it is an interface.

Here is the stack trace: [NotSupportedException: Cannot serialize member HannaPrintsDataAccess.Customer.CustomerAddresses of type System.Collections.Generic.IList`1[[HannaPrintsDataAccess.CustomerAddress, HannaPrintsDataAccess, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] because it is an interface.]

[InvalidOperationException: Cannot serialize member 'HannaPrintsDataAccess.Customer.CustomerAddresses' of type 'System.Collections.Generic.IList`1[[HannaPrintsDataAccess.CustomerAddress, HannaPrintsDataAccess, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]', see inner exception for more details.]

System.Xml.Serialization.StructModel.CheckSupportedMember(TypeDesc typeDesc, MemberInfo member, Type type) +889917

System.Xml.Serialization.StructModel.GetPropertyModel(PropertyInfo propertyInfo) +132

System.Xml.Serialization.StructModel.GetFieldModel(MemberInfo memberInfo) +129

System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter) +1226

System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter) +460

System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter) +1415

[InvalidOperationException: There was an error reflecting type 'HannaPrintsDataAccess.Customer'.]

System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter) +1621

System.Xml.Serialization.XmlReflectionImporter.ImportAccessorMapping(MemberMapping accessor, FieldModel model, XmlAttributes a, String ns, Type choiceIdentifierType, Boolean rpc, Boolean openModel, RecursionLimiter limiter) +10296

System.Xml.Serialization.XmlReflectionImporter.ImportFieldMapping(StructModel parent, FieldModel model, XmlAttributes a, String ns, RecursionLimiter limiter) +139

System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter) +1273

[InvalidOperationException: There was an error reflecting property 'Customer'.]

System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter) +2167

System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter) +460

System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter) +1415

[InvalidOperationException: There was an error reflecting type 'HannaPrintsDataAccess.CustomerAddress'.] System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter) +1621

System.Xml.Serialization.XmlReflectionImporter.CreateArrayElementsFromAttributes(ArrayMapping arrayMapping, XmlArrayItemAttributes attributes, Type arrayElementType, String arrayElementNs, 开发者_JAVA技巧RecursionLimiter limiter) +227

System.Xml.Serialization.XmlReflectionImporter.ImportArrayLikeMapping(ArrayModel model, String ns, RecursionLimiter limiter) +207

System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter) +1143

[InvalidOperationException: There was an error reflecting type 'HannaPrintsDataAccess.CustomerAddress[]'.] System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter) +1621

System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, RecursionLimiter limiter) +28

System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel model, XmlRootAttribute root, String defaultNamespace, RecursionLimiter limiter) +125

System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace) +97

System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) +461

System.Xml.Serialization.XmlSerializer..ctor(Type type) +6

HannaPrintsBusiness.Services.Live.CustomerService.GetCustomerAddressesXml(CustomerAddress[] customerAddresses) in E:\ProjectsOld\HannaPrints\HannaPrintsBusiness\Services\Live\CustomerService.cs:148 CreateGreetingCard.orderButton_Click(Object sender, EventArgs e) in c:\HostingSpaces\greetwus\galadavetiye.com\wwwroot\HannaPrints\HannaPrints\WebUI\CreateGreetingCard.aspx.cs:198 System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111

System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110

System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10

System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36

System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565

I cant seem to figure this out, I am pretty sure its just some configuration that needs to be changed because before we got this code, supposedly it was working correctly, but we cant figure out why we are getting this error. If anyone could help that would be great. Thanks!!!

UPDATE I tried changing the IList to List, but it does not do anything. Here is my classes with the customer address:

CUSTOMER CLASS:::

using System;

using System.Collections.Generic; using Castle.ActiveRecord;

namespace HannaPrintsDataAccess { public partial class Customer { private IList _customerAddresses;

    public CustomerAddress GetPrimaryCustomerAddress()
    {
        foreach (CustomerAddress address in _customerAddresses)
        {
            if (address.IsPrimary)
                return address;
        }
        return null;
    }


    [HasMany(typeof(CustomerAddress), ColumnKey = "CustomerId", Table = "Customer")]
    public virtual IList<CustomerAddress> CustomerAddresses
    {
        get
        {
            return this._customerAddresses;
        }
        set
        {
            this._customerAddresses = value;
        }
    }
}

}

Here is the Customer Address class::::

using System.IO;

using System.Xml.Serialization; using Castle.ActiveRecord;

namespace HannaPrintsDataAccess { public partial class CustomerAddress { public string ToXml() { XmlSerializer serializer = new XmlSerializer(GetType()); MemoryStream memoryStream = new MemoryStream(); serializer.Serialize(memoryStream, this); memoryStream.Seek(0, SeekOrigin.Begin); return new StreamReader(memoryStream).ReadToEnd(); }

    [BelongsTo("CustomerId")]
    public virtual Customer Customer { get; set; }
}

}

Thanks again for your help


As the error message explicitly tells you the XmlSerializer cannot serialize interfaces.

You probably had:

public List<CustomerAddress> CustomerAddresses  { get; set; }

which you changed to:

public IList<CustomerAddress> CustomerAddresses  { get; set; }

which no longer works.


You can put

[System.Xml.Serialization.XmlElement(Type = typeof(List<HannaPrintsDataAccess.CustomerAddress>) )]

on the property

HannaPrintsDataAccess

Assuming that the member is in fact an instance of List<T>

Basically, this attribute is required to support inheritance with Xml serialization. That is, if a property is of type IList and the instance is of type List<T> (which inherits from IList), you will need to add that attribute to the property specifying List<T>.


The interface property is still public, so the serializer will still attempt to serialize it (and crash).

Put an XmlIgnore attribute on the interface property like this:

[XmlIgnore]
[HasMany(typeof(CustomerAddress), ColumnKey = "CustomerId", Table = "Customer")]
public virtual IList<CustomerAddress> CustomerAddresses
{
    get
    {
        return this._customerAddresses;
    }
    set
    {
        this._customerAddresses = value;
    }
}

You List implementation is screwed up also. Add this declaration right below your IList<CustomerAddress> property declaration:

public List<CustomerAddress> CustomerAddresses
{
    get
    {
        return (List<CustomerAddress>)this._customerAddresses;
    }
    set
    {
        this._customerAddresses = value;
    }
}

HTH...

P.S. For future reference, remember that all public properties are visible to the xml serializer, and it will try to serialize them. Make sure to put XmlIgnore attributes on the properties that should not be serialized.


The error message seems pretty clear to me:

Exception Details: System.NotSupportedException: Cannot serialize member HannaPrintsDataAccess.Customer.CustomerAddresses of type System.Collections.Generic.IList`1[[HannaPrintsDataAccess.CustomerAddress, HannaPrintsDataAccess, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] because it is an interface.

Try replacing the type of HannaPrintsDataAccess.Customer.CustomerAddresses, which is currently IList<CustomerAddress>, with the concrete type (e.g. List<CustomerAddress>) instead of the interface.


I had such exception with $.ajax request, contentType: "application/json; charset=utf-8" fixed my problem.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜