2009-07-26 11 views
11

¿Puede decirme cuál es la mejor manera de enviar objetos a través de NamedPipes en .net 3.5?¿Cómo enviar objetos a través de NamedPipe en .NET 3.5?

+3

No enviar objetos a través de las comunicaciones intra-proceso, que envían la representación de ellos, de texto o binario. Estos se utilizan para crear el objeto en el otro lado – blowdart

+0

Véase mi respuesta actualizada para un enlace que explica acerca serialising objetos a los arroyos. –

+0

Aquí hay una [post útil] (http://www.switchonthecode.com/tutorials/dotnet-35-adds-named-pipes-support). Para enviar objetos a través de arroyos, leer por primera vez sobre este [aquí] (http://www.codeguru.com/Csharp/Csharp/cs_data/streaming/article.php/c4223) y (http [aquí]: // www. codeguru.com/columns/dotnet/article.php/c6595). –

Respuesta

2

serializar el objeto de send it as a text y deserializar en el otro lado, o usar WCF canalizaciones con nombre unión como se sugiere Remus

+0

¿Por qué usar Serialización XML si está utilizando WCF? ¿Por qué no utilizar el serializador de contrato de datos, que permitirá que el objeto se envíe en binrary? –

+0

Es mejor utilizar XmlSerializer si no quiere usar WCF, sí se pueden utilizar los datos del contrato Serializador demasiado –

1

Lo que se busca es DataContract atributo. Vea también: MSDN Using Data Contracts.

Un contrato de datos es un acuerdo formal entre un servicio y un cliente que describe abstractamente los datos que se intercambiarán. Es decir, para comunicarse, el cliente y el servicio no tienen que compartir los mismos tipos, solo los mismos contratos de datos. Un contrato de datos define con precisión, para cada parámetro o tipo de retorno, qué datos se serializan (convertidos en XML) para ser intercambiados.

Su contrato de servicio:

[ServiceContract] 
public interface IApplicationRegistration 
{ 
    // Sends the application information 
    [OperationContract] 
    bool RegisterApplication(AppInfo appInfo); 
} 

Los datos del Intercambio:

[DataContract] 
public class AppInfo 
{ 
    private int _processID; 
    private string _processName; 

    [DataMember] 
    public int ProcessID 
    { 
     get { return _processID; } 
     set { _processID = value; } 
    } 

    [DataMember] 
    public string ProcessName 
    { 
     get { return _processName; } 
     set { _processName= value; } 
    } 
} 
3

WCF NetNamedPipes unión es el camino a seguir, también podría considerar .NET Remoting para lograr este

1

Como comentario sobre la pregunta original señalada, no envía objetos a otros procesos. Puede enviar datos a otro proceso y esos datos pueden usarse para crear un proxy o facsímil del objeto original en el otro proceso, pero no puede enviar directamente un objeto .

Incluso las tecnologías que ofrecen semántica de paso de objetos entre procesos están, bajo el capó, haciendo exactamente eso. Debido a esto, siempre debe usar el estilo de operación "intentar realizar una operación y capturar la excepción si falla" en lugar de "asegurarse de que está bien hacer la operación y luego ejecutarla". Incluso si el objeto parece estar en un estado válido para su operación, está viendo datos antiguos, por lo que puede no ser válido cuando intente realizar la operación real.

Entonces, como no puede enviar objetos, lo que realmente va a terminar es serializar algunos datos (usando XmlSerializer, o DataContractSerializer, o lo que sea), leer el flujo de datos en el otro extremo y crear un nuevo objeto para representar el anterior. Es posible que le resulte más fácil crear un objeto separado para representar los datos que desea enviar a través del conducto, en lugar de la representación real en tiempo real del objeto.

WCF puede manejar muchas de estas cosas automágicamente para usted, pero no hay nada demasiado difícil como para enviarlo a través de una tubería.

Si usa WCF como otros han sugerido, tenga en cuenta que todavía no está enviando "objetos". Todavía está enviando datos, y WCF es bastante explícito al respecto (por eso lo llaman DataContractSerializer, y no ObjectSerializer). Específicamente:

1) Cualquier operación realizada en un objeto enviado con serialización de DataContract se realizará localmente.

2) Si el mismo objeto se envía dos veces, no actualizará automáticamente ninguna versión anterior, y no tendrá igualdad de referencia.Tendrás dos estructuras de datos que, en lo que respecta a C#, no están relacionadas por completo.

3) Las actualizaciones de un objeto sólo se llevarán a cabo a nivel local, y no se actualizarán automáticamente otros procesos con el "mismo" objeto.

Si está absolutamente convencido de que necesita pasar "objetos" a través de los procesos, puede hacer los suyos (lo que de hecho recomendaría, aunque es más trabajo), o usar el espacio de nombres System.Remoting.

Incluso si está utilizando System.Remoting, tenga en cuenta que lo que he mencionado anteriormente es lo que está sucediendo en realidad , y diseñe sus objetos y sistema con eso en mente. Obtendrás resultados mucho mejores.