c# - interfaces - No se puede serializar miembro... porque es una interfaz
implementacion de interfaces c# (2)
He estado teniendo este problema y he estado sacándome el pelo. Tengo el siguiente error:
Detalles de la excepción: System.NotSupportedException: No se puede serializar el miembro HannaPrintsDataAccess.Customer.CustomerAddresses de tipo System.Collections.Generic.IList`1 [[HannaPrintsDataActualidadEcceso en este artículo. es una interfaz
Error de fuente:
Línea 196: Cliente cliente = OperationsManager.Instance.CustomerService.GetCustomer (7); Línea 197: Línea 198: cadena xml = OperationsManager.Instance.CustomerService.GetCustomerAddressesXml (CustomerAddress.FindAll ()); Línea 199: Línea 200: Orden de pedido = OperationsManager.Instance.OrderService.CreateOrderFromCart (xml);
Archivo de origen: c: / HostingSpaces / greetwus / galadavetiye.com / wwwroot / HannaPrints / HannaPrints / WebUI / CreateGreetingCard.aspx.cs Línea: 198
Traza de la pila:
[NotSupportedException: No se puede serializar el miembro HannaPrintsDataAccess.Customer.CustomerAddresses de tipo System.Collections.Generic.IList`1 [[HannaPrintsDataAccess.CustomerAddress.En este caso, no tenemos que tener en cuenta los valores de este artículo. .]
[InvalidOperationException: no se puede serializar el miembro ''HannaPrintsDataAccess.Customer.CustomerAddresses'' de tipo ''System.Collections.Generic.IList`1 [[HannaPrintsDataAccess.cidad.PublicidadTenque Encargado de la VíctimaContenidoPenque Encargado de Víctor vea la excepción interna para obtener más detalles.] System.Xml.Serialization.StructModel.CheckSupportedMember (TypeDesc typeDesc, MemberInfo miembro, Type type) +889917 System.Xml.Serialization.StructModel.GetPropertyModel (PropertyInfo propertyInfo) +132 ...... ..
He cambiado todos mis IList''s a List''s para ver si eso haría algo, pero no, de hecho, ni siquiera tardó un segundo en cargarse después de hacer esos cambios, supongo que el error ocurre incluso antes de que llegue a esa parte. Revisé mis archivos remotos para ver si estaba cargando correctamente y lo fue.
Aquí está el código:
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;
}
}
}
}
El error ocurre cuando se activa este código:
protected void orderButton_Click(object sender, EventArgs e)
{
Customer customer = OperationsManager.Instance.CustomerService.GetCustomer(7);
string xml = OperationsManager.Instance.CustomerService.GetCustomerAddressesXml(CustomerAddress.FindAll());
Order order = OperationsManager.Instance.OrderService.CreateOrderFromCart(xml);
OperationsManager.Instance.CartService.MoveCart("MyDesigns");
Response.Redirect("~/Customer/PayByCreditCard.aspx?orderGuid=" + order.OrderGuid);
}
La clase CustomerAddress:
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; }
}
}
En el código que publicó, el tipo de CustomerAddresses
es IList<CustomerAdress>
. Eso es una interfaz. Como dice el mensaje de error, no puede serializar una interfaz.
No es la fuente de tu problema, pero necesitas
using (MemoryStream memoryStream = new MemoryStream())
{
serializer.Serialize(memoryStream, this);
memoryStream.Seek(0, SeekOrigin.Begin);
using (StreamReader reader = new StreamReader(memoryStream))
{
return reader.ReadToEnd();
}
}