2009-07-26 1 views
11

Можете ли вы рассказать мне, что является лучшим способом отправки объектов через NamedPipes в .net 3.5?Как отправить объект через NamedPipe в .NET 3.5?

+3

Вы не отправлять объекты через внутри процесса коммуникации, вы отправляете представления их, текстовый или двоичный файл. Затем они используются для воссоздания объекта с другой стороны. – blowdart

+0

См. Мой обновленный ответ для ссылки, которая объясняет сериализацию объектов в потоках. –

+0

Вот [полезный пост] (http://www.switchonthecode.com/tutorials/dotnet-35-adds-named-pipes-support). Чтобы отправлять объекты через потоки, сначала прочитайте об этом [здесь] (http://www.codeguru.com/Csharp/Csharp/cs_data/streaming/article.php/c4223) и [здесь] (http: // www. codeguru.com/columns/dotnet/article.php/c6595). –

ответ

2

сериализовать объект, XmlSerializer чем send it as a text и десериализации в другую сторону, или использовать WCF именованных каналов привязки, как Рем предлагает

+0

Зачем использовать XML Serialization, если вы используете WCF? Почему бы не использовать Serializer Data Contract Serializer, который позволит отправить объект в другом порядке? –

+0

Я предлагаю использовать XmlSerializer, если он не хочет использовать WCF, он также может использовать Serializer Data Contract –

1

Что вы ищете DataContract атрибут. См. Также: MSDN Using Data Contracts.

Договор о предоставлении данных является официальным соглашением между службой и клиентом, который абстрактно описывает данные, подлежащие обмену. То есть для связи клиент и служба не должны использовать одни и те же типы, только одни и те же контракты данных. Контракт данных точно определяет для каждого параметра или типа возврата какие данные сериализуются (превращаются в XML) для обмена.

Ваш контракт на обслуживание:

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

Данные для обмена:

[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 связывание является путь, вы можете также рассмотреть .NET Remoting для достижения этой

1

В качестве комментария к указанному первому вопросу вы не отправляете объекты другим процессам. Вы можете отправить данные другому процессу, и эти данные могут быть использованы для создания прокси или факсимиле исходного объекта в другом процессе, но вы не можете напрямую отправить объект .

Даже те технологии, которые предлагают межпроцессную семантику передачи объектов, находятся под капотом, делая именно это. Из-за этого вы всегда должны использовать «попытаться выполнить операцию и уловить исключение, если она не работает», а не «убедиться, что все в порядке, чтобы выполнить операцию, а затем выполнить ее». Даже если объект выглядит так, как будто он находится в правильном состоянии для вашей операции, вы смотрите на старые данные, и поэтому он может быть недействительным при попытке выполнить фактическую операцию.

Итак, поскольку вы не можете отправлять объекты, то, что вы действительно собираетесь делать, это сериализация некоторых данных (с использованием XmlSerializer или DataContractSerializer или что-то еще), чтение потока данных на другом конце и создание новый объект для представления старого. Вам может быть проще создать отдельный объект для представления данных, которые вы хотите отправить по трубе, в отличие от реального живого представления объекта.

WCF может обрабатывать много всего этого материала автоматически для вас, но нет ничего сложного в том, чтобы отправлять его по трубе самостоятельно.

Если вы используете WCF, как предложили другие, имейте в виду, что вы по-прежнему не отправляете «объекты». Вы по-прежнему отправляете данные, и WCF довольно откровенен в этом вопросе (поэтому они называют его DataContractSerializer, а не ObjectSerializer). В частности:

1) Любые операции, выполняемые над объектом, посланным с сериализацией DataContract, будут выполняться локально.

2) Если один и тот же объект отправляется дважды, он не будет автоматически обновлять старые версии, и у них не будет ссылочного равенства.У вас будет две структуры данных, которые в отношении C# полностью не связаны.

3) Обновления объекта будут выполняться только локально и не будут автоматически обновлять другие процессы с помощью «того же» объекта.

Если вы абсолютно уверены, что вам нужно передать «объекты» через процессы, вы можете либо свернуть свой собственный (что я бы рекомендовал, даже если это больше работает), либо использовать пространство имен System.Remoting.

Даже если вы используете System.Remoting, поймите, что то, о чем я говорил выше, это то, что происходит на самом деле, происходит и проектирует ваши объекты и систему с учетом этого. Вы получите намного лучшие результаты.