Tengo una aplicación cliente-servidor, partes de las cuales "hablan" entre sí a través de WCF (enlace netTcp).WCF. IList se deserializa como matriz. ¿Cómo hacer que sea una lista de escritura (ArrayList)?
tengo mi DataContract, que tiene 1 campo de una clase tercera parte:
[Serializable]
public class MyResult{
public ThirdPartyResult Result {get;set;}
/* other fields */
}
Usando la reflexión veo esto:
[Serializable]
public class ThirdPartyResult {
private IList result;
public IList Result
{
get { return result ?? (result = new ArrayList());}
}
}
Al llamar al servidor desde el cliente tengo el result
como ArrayList
en el servidor. Después de que llega al cliente, el campo result
se convierte en una matriz de tamaño fijo.
me hizo no utilización referencia de servicio Agregar, pero yo uso el montaje compartir y sólo hacer
ChannelFactory<IMyContract>.CreateChannel(new NetTcpBinding("Configuration.Name"), address);
ACTUALIZACIÓN: Contrato el servicio
[ServiceContract]
[ServiceKnownType(typeof(ArrayList))]
[ServiceKnownType(typeof(ThirdPartyResult))]
public interface IMyContract
{
MyResult GetResult();
}
Ahora la pregunta:
¿Cómo puedo decirle a WCF que use ArrayList
en lugar de Array
?
me ocurrió una solución muy mala (desde mi punto de vista)
Generalmente Yo quería un ArrayList
a ser preservado para poder añadir elementos a ella. Finalmente, se me ocurrió la solución a continuación. Sí, lo sé, esto es completamente malo, y es por eso que todavía estoy buscando una mejor variante.
if (thirdParty.Results != null && thirdParty.Results.IsFixedSize)
{
var results = new ArrayList(thirdParty.Results);
// Finding result by ReferenceEquals to not be tight to private variable name
var resultsField = thirdParty.GetType()
.GetFields(BindingFlags.Default | BindingFlags.Instance | BindingFlags.NonPublic)
.Where(f => ReferenceEquals(f.GetValue(thirdParty), thirdParty.Results))
.FirstOrDefault();
if (resultsField != null)
resultsField.SetValue(thirdParty, results);
}
thirdParty.AddResult(otherChild);
Algo usando '[Serializable]' y 'ArrayList' (que no es escrito, es decir,' object'), entonces no es realmente una contrato de datos ...? –
Sí, puede que tengas razón. Este no es un contrato de datos verdadero (marcado como [DataContract]). Sin embargo, el enlace netTcp usa serialización binaria y es suficiente que la clase sea [Serializable]. Esta no es una colección de solo objeto, ya que de hecho es una colección de 'ThirdPartyResult', que se agrega a los tipos conocidos (pregunta actualizada) –
¿Puedo verificarlo? o bien está utilizando un servicio-referencia/svcutil, o tiene ensamblado compartido. Si tiene un método de ensamblaje compartido, entonces es un tema discutible ya que usted mismo está definiendo los tipos. Entonces ... ¿de dónde viene 'IMyContract' si no está (según la pregunta) utilizando una referencia de servicio? –