Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Serginio1, Вы писали:
S>>Кто о чем, а вшивый о бане.
S>> Сейчас в .Net Core нет AppDomain и RPC .
H>Я бы использовал Protobuf + как там принято в .NET Core сообщения передавать между процессами. Никакой рефлексии, магии аля MarshalByRefObject и граблей с маршаллингом того, что не предназначено для маршаллинга.
А какая огромная разница между Protobuf и Json?
Для JSON есть прекрасная библиотека
Угу а сервер кто писать будет? Вся прелесть в том, что серверную часть тебе даже писать не надо. А сериализовать объекты тебе так или иначе нужно. А затраты на рефлексию при межпроцессном взаимодействии просто ничтожны.
Да а что тебе не нравится в моей разработке. Почему Protobuf лучше?
Граблей с маршалингом нет, затраты на рефлексию можно не рассматривать при этом все происходит автоматически.
И код мало отличается от работы с объектами напрямую.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Угу а сервер кто писать будет? Вся прелесть в том, что серверную часть тебе даже писать не надо.
Ну вот тут уже надо смотреть что доступно в корке для общения со внешним миром. Написать один раз TCP-сервер и клиент с пулом соединений не очень трудно.
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Serginio1, Вы писали:
S>> А какая огромная разница между Protobuf и Json? S>>Для JSON есть прекрасная библиотека
H>Сообщения протокола известны статически. Непонятно какие типы не уйдут в сеть и не придут внезапно из сети.
Ну опять же тебе нужно писать сервер. При моем подходе писать сервер не надо. Загружаешь нужные сборки и работаешь с ними удаленного.
Я понимаю, что web Api наше все. А как с асинхронными методами, событиями?
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Serginio1, Вы писали:
S>>Угу а сервер кто писать будет? Вся прелесть в том, что серверную часть тебе даже писать не надо.
H>Ну вот тут уже надо смотреть что доступно в корке для общения со внешним миром. Написать один раз TCP-сервер и клиент с пулом соединений не очень трудно.
Так он написан. Через него и происходит общение.
namespace ClientRPC
{
public enum EnumVar:byte
{
VTYPE_EMPTY = 0,
VTYPE_NULL,
VTYPE_I2, //int16
VTYPE_I4, //int32
VTYPE_R4, //float
VTYPE_R8, //double
VTYPE_Decimal, //Decimal
VTYPE_DATE, //DATE (double)
VTYPE_BOOL, //bool
VTYPE_I1, //int8
VTYPE_UI1, //uint8
VTYPE_UI2, //uint16
VTYPE_UI4, //uint32
VTYPE_I8, //int64
VTYPE_UI8, //uint64
VTYPE_INT, //int Depends on architecture
VTYPE_CHAR, //char
VTYPE_PWSTR, //struct wstr
VTYPE_BLOB, //means in struct str binary data contain
VTYPE_GUID, //Guid
VTYPE_AutoWrap, // Net Object
VTYPE_JSObject
};
// Класс WorkVariants осуществляет сериализацию и десериализацию объектовpublic class WorkVariants
{
internal static Dictionary<Type, EnumVar> MatchTypes;
static WorkVariants()
{
// Напрямую сериализуются byte[],числа, строки,булево,Дата,char,Guid
//Для AutoWrapClient передается индекс в хранилище
MatchTypes = new Dictionary<Type, EnumVar>()
{
{ typeof(Int16),EnumVar.VTYPE_I2 },
{typeof(Int32),EnumVar.VTYPE_I4 },
{typeof(float),EnumVar.VTYPE_R4 },
{typeof(double),EnumVar.VTYPE_R8 },
{typeof(decimal),EnumVar.VTYPE_Decimal},
{typeof(bool),EnumVar.VTYPE_BOOL },
{typeof(sbyte),EnumVar.VTYPE_I1 },
{typeof(byte),EnumVar.VTYPE_UI1 },
{typeof(UInt16),EnumVar.VTYPE_UI2},
{typeof(UInt32),EnumVar.VTYPE_UI4},
{typeof(Int64),EnumVar.VTYPE_I8},
{typeof(UInt64),EnumVar.VTYPE_UI8},
{typeof(char),EnumVar.VTYPE_CHAR},
{typeof(string),EnumVar.VTYPE_PWSTR},
{typeof(byte[]),EnumVar.VTYPE_BLOB},
{typeof(DateTime),EnumVar.VTYPE_DATE},
{typeof(AutoWrapClient),EnumVar.VTYPE_AutoWrap},
{typeof(Guid),EnumVar.VTYPE_GUID}//,
// {typeof(AutoWrap),EnumVar.VTYPE_JSObject}
};
}
public static DateTime ReadDateTime(BinaryReader stream)
{
long nVal = stream.ReadInt64();
//get 64bit binaryreturn DateTime.FromBinary(nVal);
}
public static void WriteDateTime(DateTime value,BinaryWriter stream)
{
long nVal = value.ToBinary();
//get 64bit binary
stream.Write(nVal);
}
public static byte[] ReadByteArray(BinaryReader stream)
{
var length = stream.ReadInt32();
return stream.ReadBytes(length);
}
public static object GetObject(BinaryReader stream, TCPClientConnector Connector)
{
// Считываем тип объекта
EnumVar type =(EnumVar)stream.ReadByte();
// В зависмости от типа считываем и преобразуем данныеswitch (type)
{
case EnumVar.VTYPE_EMPTY:
case EnumVar.VTYPE_NULL: return null;
case EnumVar.VTYPE_I2: return stream.ReadInt16();
case EnumVar.VTYPE_I4: return stream.ReadInt32();
case EnumVar.VTYPE_R4: return stream.ReadSingle();
case EnumVar.VTYPE_R8: return stream.ReadDouble();
case EnumVar.VTYPE_Decimal: return stream.ReadDecimal();
case EnumVar.VTYPE_BOOL: return stream.ReadBoolean();
case EnumVar.VTYPE_I1: return stream.ReadSByte();
case EnumVar.VTYPE_UI1: return stream.ReadByte();
case EnumVar.VTYPE_UI2: return stream.ReadUInt16();
case EnumVar.VTYPE_UI4: return stream.ReadUInt32();
case EnumVar.VTYPE_I8: return stream.ReadInt64();
case EnumVar.VTYPE_UI8: return stream.ReadUInt64();
case EnumVar.VTYPE_CHAR: return stream.ReadChar();
case EnumVar.VTYPE_PWSTR: return stream.ReadString();
case EnumVar.VTYPE_BLOB: return ReadByteArray(stream);
case EnumVar.VTYPE_DATE: return ReadDateTime(stream);
case EnumVar.VTYPE_GUID: return new Guid(stream.ReadBytes(16));
case EnumVar.VTYPE_AutoWrap:
var Target= stream.ReadInt32();
var AW = new AutoWrapClient(Target, Connector);
return AW;
}
return null;
}
public static bool WriteObject(object Объект, BinaryWriter stream)
{
// Если null то записываем только VTYPE_NULLif (Объект == null)
{
stream.Write((byte)EnumVar.VTYPE_NULL);
return true;
}
// Если это RefParam то сериализуем значение из Value
// Нужен для возвращения out значения в Value if (Объект.GetType() == typeof(RefParam))
{
object value= ((RefParam)Объект).Value;
return WriteObject(value, stream);
}
EnumVar type;
// Ищем тип в словаре MatchTypesvar res = MatchTypes.TryGetValue(Объект.GetType(), out type);
// Если тип не поддерживаемый вызываем исключениеif (!res) {
throw new Exception("Неверный тип " + Объект.GetType().ToString());
return false;
}
// Записываем тип объекта
stream.Write((byte)type);
// В зависимости от типа сериализуем объектswitch (type)
{
case EnumVar.VTYPE_I2: stream.Write((Int16)Объект); break;
case EnumVar.VTYPE_I4: stream.Write((Int32)Объект); break;
case EnumVar.VTYPE_R4: stream.Write((float)Объект); break;
case EnumVar.VTYPE_R8: stream.Write((double)Объект); break;
case EnumVar.VTYPE_Decimal: stream.Write((decimal)Объект); break;
case EnumVar.VTYPE_BOOL: stream.Write((bool)Объект); break;
case EnumVar.VTYPE_I1: stream.Write((sbyte)Объект); break;
case EnumVar.VTYPE_UI1: stream.Write((byte)Объект); break;
case EnumVar.VTYPE_UI2: stream.Write((UInt16)Объект); break;
case EnumVar.VTYPE_UI4: stream.Write((UInt32)Объект); break;
case EnumVar.VTYPE_I8: stream.Write((Int64)Объект); break;
case EnumVar.VTYPE_UI8: stream.Write((UInt64)Объект); break;
case EnumVar.VTYPE_CHAR: stream.Write((char)Объект); break;
case EnumVar.VTYPE_PWSTR: stream.Write((string)Объект); break;
case EnumVar.VTYPE_BLOB: stream.Write((byte[])Объект); break;
case EnumVar.VTYPE_DATE: WriteDateTime((DateTime)Объект, stream); break;
case EnumVar.VTYPE_GUID: stream.Write(((Guid)Объект).ToByteArray()); break;
case EnumVar.VTYPE_AutoWrap:
stream.Write(((AutoWrapClient)Объект).Target);
break;
}
return true;
}
}
}
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Serginio1, Вы писали:
S>>Угу а сервер кто писать будет? Вся прелесть в том, что серверную часть тебе даже писать не надо.
H>Ну вот тут уже надо смотреть что доступно в корке для общения со внешним миром. Написать один раз TCP-сервер и клиент с пулом соединений не очень трудно.
Здравствуйте, Serginio1, Вы писали:
S> А какая огромная разница между Protobuf и Json?
Производительность.
S>Для JSON есть прекрасная библиотека
Нашел новую игрушку? Увы, но для остальных это не аргумент.
S>Граблей с маршалингом нет, затраты на рефлексию
Затраты на рефлексию, по результатам реальных замеров, это 90% всей работы при передаче по ip. При передаче по более быстрым каналам, особенно по CrossAppDomainChannel цифра вообще близка к 100%.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
S>>Сил вложено немало. В итоге получилось поделие даже не хуже WCF.
AVK>Хуже, причем сильно хуже. Ты просто не понимаешь что такое WCF.
Которого нет Net Core.
А конструктивная критика?
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
S>> А какая огромная разница между Protobuf и Json?
AVK>Производительность.
При межпроцессном взаимодействии разница ничтожна. S>>Для JSON есть прекрасная библиотека
AVK>Нашел новую игрушку? Увы, но для остальных это не аргумент.
S>>Граблей с маршалингом нет, затраты на рефлексию
AVK>Затраты на рефлексию, по результатам реальных замеров, это 90% всей работы при передаче по ip. При передаче по более быстрым каналам, особенно по CrossAppDomainChannel цифра вообще близка к 100%.
Угу. При внутрипроссном взаимодействии 500 000 вызовов в секунду
В том же CEF при взаимодействии между JS кодом нативои и .Net Core 60 000 вызовов в секунду.
А по TCP всего 2000 вызовов в секунду.
Здравствуйте, Serginio1, Вы писали:
H>>Сообщения протокола известны статически. Непонятно какие типы не уйдут в сеть и не придут внезапно из сети.
S>Ну опять же тебе нужно писать сервер. При моем подходе писать сервер не надо. Загружаешь нужные сборки и работаешь с ними удаленного.
S>Я понимаю, что web Api наше все. А как с асинхронными методами, событиями?
У меня пока не стоит задача удаленного взаимодействия в .Net Core, но когда встанет, я буду смотреть в сторону Protobuf + MQ фреймворк, типа ZeroMQ или RabbitMQ. Но не исключено, чот сделаю свой велосипед на общей памяти вместо TCP/IP.
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Serginio1, Вы писали:
H>>>Сообщения протокола известны статически. Непонятно какие типы не уйдут в сеть и не придут внезапно из сети.
S>>Ну опять же тебе нужно писать сервер. При моем подходе писать сервер не надо. Загружаешь нужные сборки и работаешь с ними удаленного.
S>>Я понимаю, что web Api наше все. А как с асинхронными методами, событиями?
H>У меня пока не стоит задача удаленного взаимодействия в .Net Core, но когда встанет, я буду смотреть в сторону Protobuf + MQ фреймворк, типа ZeroMQ или RabbitMQ. Но не исключено, чот сделаю свой велосипед на общей памяти вместо TCP/IP.
Ну с в Net Core вроде обещали поддержку пайпов. Несложно переделать обмен по Tcp/ip. А чем тебе мой варианет не нравится?
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
S>> А какая огромная разница между Protobuf и Json?
AVK>Производительность.
JSON применяется только для круных объектов, чтобы заполнять их на клиенте
Dictionary<int, string> ClientDict = new Dictionary<int, string>()
{
[1] = "Один",
[2] = "Второй2",
[3] = "Один3"
};
var @Dictionary2 = wrap.GetType("System.Collections.Generic.Dictionary`2", "System.Collections");
var @DictionaryIntString = wrap.GetGenericType(@Dictionary2, "System.Int32", "System.String");
// Скопируем словарь на сервер
// Закомментированы различные варианты
// var dict = connector.CoryTo(@DictionaryIntString, ClientDict);
// var dict = connector.CoryTo("System.Collections.Generic.Dictionary`2[System.Int32, System.String]", ClientDict);
// Скопируем словарь на серверvar dict = connector.CoryTo(ClientDict);
Для всех остальных обычная бинарная сериализация
stream.Write((byte)type);
// В зависимости от типа сериализуем объектswitch (type)
{
case EnumVar.VTYPE_I2: stream.Write((Int16)Объект); break;
case EnumVar.VTYPE_I4: stream.Write((Int32)Объект); break;
case EnumVar.VTYPE_R4: stream.Write((float)Объект); break;
case EnumVar.VTYPE_R8: stream.Write((double)Объект); break;
case EnumVar.VTYPE_Decimal: stream.Write((decimal)Объект); break;
case EnumVar.VTYPE_BOOL: stream.Write((bool)Объект); break;
case EnumVar.VTYPE_I1: stream.Write((sbyte)Объект); break;
case EnumVar.VTYPE_UI1: stream.Write((byte)Объект); break;
case EnumVar.VTYPE_UI2: stream.Write((UInt16)Объект); break;
case EnumVar.VTYPE_UI4: stream.Write((UInt32)Объект); break;
case EnumVar.VTYPE_I8: stream.Write((Int64)Объект); break;
case EnumVar.VTYPE_UI8: stream.Write((UInt64)Объект); break;
case EnumVar.VTYPE_CHAR: stream.Write((char)Объект); break;
case EnumVar.VTYPE_PWSTR: stream.Write((string)Объект); break;
case EnumVar.VTYPE_BLOB: stream.Write((byte[])Объект); break;
case EnumVar.VTYPE_DATE: WriteDateTime((DateTime)Объект, stream); break;
case EnumVar.VTYPE_GUID: stream.Write(((Guid)Объект).ToByteArray()); break;
case EnumVar.VTYPE_AutoWrap:
stream.Write(((AutoWrapClient)Объект).Target);
break;
}
return true;
S>>Для JSON есть прекрасная библиотека
AVK>Нашел новую игрушку? Увы, но для остальных это не аргумент.
JSON сериализация нужна для крупных объектов, что бы не заполнять их на сервере.
Если нужна скорость, то вручную сериализуй и десериализуй на сервере. Никто же не запрещает.
Я пока решил для объетов кроме вышеупомянутых не делать автоматическую сериализацию.
S>>Граблей с маршалингом нет, затраты на рефлексию
AVK>Затраты на рефлексию, по результатам реальных замеров, это 90% всей работы при передаче по ip. При передаче по более быстрым каналам, особенно по CrossAppDomainChannel цифра вообще близка к 100%.
Кстати не нашел пайпов для .Net Core. Может плохо искал?
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
AVK>>Производительность. S> При межпроцессном взаимодействии разница ничтожна.
Как раз при межпроцессном разница огромна, потому что каналы очень быстрые и с минимальной латентностью.
S> Угу. При внутрипроссном взаимодействии 500 000 вызовов в секунду
А латентность?
S>А по TCP всего 2000 вызовов в секунду.
Ты просто не умеешь его готовить.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Serginio1, Вы писали:
AVK>>>Производительность. S>> При межпроцессном взаимодействии разница ничтожна.
AVK>Как раз при межпроцессном разница огромна, потому что каналы очень быстрые и с минимальной латентностью.
S>> Угу. При внутрипроссном взаимодействии 500 000 вызовов в секунду
AVK>А латентность?
S>>А по TCP всего 2000 вызовов в секунду.
AVK>Ты просто не умеешь его готовить.
Так вот я и спрашиваю как? Никто не отвечает
и солнце б утром не вставало, когда бы не было меня