Как отправить объект через NamedPipe в.NET 3.5?

Ниже приведен код Патрика Дежарденса (псевдоним Daok) с небольшим количеством добавленных комментариев и некоторыми незначительными изменениями:

/* 
decimal_sep: character used as deciaml separtor, it defaults to '.' when omitted
thousands_sep: char used as thousands separator, it defaults to ',' when omitted
*/
Number.prototype.toMoney = function(decimals, decimal_sep, thousands_sep)
{ 
   var n = this,
   c = isNaN(decimals) ? 2 : Math.abs(decimals), //if decimal is zero we must take it, it means user does not want to show any decimal
   d = decimal_sep || '.', //if no decimal separator is passed we use the dot as default decimal separator (we MUST use a decimal separator)

   /*
   according to [https://stackoverflow.com/questions/411352/how-best-to-determine-if-an-argument-is-not-sent-to-the-javascript-function]
   the fastest way to check for not defined parameter is to use typeof value === 'undefined' 
   rather than doing value === undefined.
   */   
   t = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, //if you don't want to use a thousands separator you can pass empty string as thousands_sep value

   sign = (n < 0) ? '-' : '',

   //extracting the absolute value of the integer part of the number and converting to string
   i = parseInt(n = Math.abs(n).toFixed(c)) + '', 

   j = ((j = i.length) > 3) ? j % 3 : 0; 
   return sign + (j ? i.substr(0, j) + t : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : ''); 
}

и вот некоторые тесты:

//some tests (do not forget parenthesis when using negative numbers and number with no decimals)
alert(123456789.67392.toMoney() + '\n' + 123456789.67392.toMoney(3) + '\n' + 123456789.67392.toMoney(0) + '\n' + (123456).toMoney() + '\n' + (123456).toMoney(0) + '\n' + 89.67392.toMoney() + '\n' + (89).toMoney());

//some tests (do not forget parenthesis when using negative numbers and number with no decimals)
alert((-123456789.67392).toMoney() + '\n' + (-123456789.67392).toMoney(-3));

Незначительные изменения:

  1. немного сдвинули Math.abs(decimals), чтобы сделать это только тогда, когда нет NaN.

  2. decimal_sep больше не может быть пустой строкой (НЕОБХОДИМО использовать какой-то десятичный разделитель)

  3. мы используем typeof thousands_sep === 'undefined', как предложено в Как Лучше всего определить, не был ли аргумент передан в функцию JavaScript

  4. (+n || 0) не требуется, поскольку this является объектом Number

Дж.С. Фиддл

11
задан djot 7 October 2013 в 10:48
поделиться

6 ответов

2
ответ дан 3 December 2019 в 10:26
поделиться

WCF NetNamedPipes binding is the way to go, you might also consider .NET Remoting to achieve this

3
ответ дан 3 December 2019 в 10:26
поделиться

Сериализуйте ваш объект с помощью XmlSerializer , чем отправьте его как текст и десериализуйте на другой стороне, или используйте привязку именованных каналов WCF, как предлагает Ремус

2
ответ дан 3 December 2019 в 10:26
поделиться

According to LINQ In Action (pg.198):

"LINQ does not come for free. LINQ queries cause additional work, object creations, and pressure on the garbage collector. The additional cost of using LINQ can vary a lot depending on the query. It can be as low as 5 percent, but can sometimes be around для каждого параметра или типа возвращаемого значения, какие данные сериализуются (преобразуются в 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; }
    }
}
1
ответ дан 3 December 2019 в 10:26
поделиться

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

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

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

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

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

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

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

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

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

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

1
ответ дан 3 December 2019 в 10:26
поделиться

Асинхронные именованные каналы здесь http://www.eggheadcafe.com/tutorials/aspnet/478ca475-2fd9-45d6- 9090-5acdaeb00162 / make-your-apps-talk-to-ea.aspx

использует часть моего кода; -)

0
ответ дан 3 December 2019 в 10:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: