Ответ U / KetanChawda-MSFT достаточно хорош, если вы действительно можете изменить веб-сервис, но так как это было вне нашего контроля над этим, нам пришлось сделать что-то еще.
Мы создали отдельный пользовательский соединитель SOAP, только для этого одного метода, через который проходит SOAP.
Соединитель имеет один метод, настроенный следующим образом, с API-интерфейсом WCF по умолчанию:
В своем приложении логики вы можете создать переменную, содержащую весь XML для стандартного запроса Soap. Я использовал SOAP UI для создания SOAP запрос и просто вставить в XML из сгенерированного запроса. Эта переменная может использоваться как тело в приложении логики, когда вы используете службу.
Этот ресурс может быть полезен для этого: https: // blogs.msdn.microsoft.com/david_burgs_blog/2018/05/03/friendlier-soap-pass-through-with-logic-app-designer-ux/
Из того, что мы пришли к выводу, это Кажется, что пользовательский соединитель на самом деле отправляет строковый тип данных вместо datetime. Похоже, что сам XML-запрос решает эту проблему.
Если Вы имеете в виду BinaryFormatter
:
event
s)Я провел много времени в этой области, включая запись (бесплатной) реализации "буферной сериализации" протокола Google API для.NET; protobuf-сеть
Это:
ISerializable
(для дистанционной работы и т.д.) и WCFУчитывая любой случайный объект, очень трудно доказать, является ли это действительно сериализуемым.
Не гарантируется, что можно сериализировать объекты назад и вперед между различными Платформами (Скажите 1.0, 1.1, 3.5), или даже различные (Моно) Реализации CLR, снова, XML лучше к этой цели.
При изменении объекта, Вы сериализируете, все старые данные Вы сериализировали и сохранили, повреждается. Если Вы сохранили в базе данных или даже XML, легче преобразовать старые данные в новый.
Управление версиями данных обрабатывается через атрибуты. Если Вы не волнуетесь по поводу управления версиями затем, это не проблема. Если Вы, это - огромная проблема.
Проблема со схемой атрибута состоит в том, что она работает довольно гладкая на многие тривиальные случаи (такие как добавление нового свойства), но ломается довольно быстро, когда Вы пытаетесь сделать что-то, любят замену два перечислимых значения с другим, новым перечислением значений (или любое количество общих сценариев, которое идет с долговечными персистентными данными).
Я мог вдаваться в большое количество подробностей, описывающих проблемы. В конце, пишущий Ваш собственный сериализатор довольно проклятый легкий, если Вы должны...
Другая проблема, которая пришла на ум:
Классы XmlSerializer расположены в совершенно другом месте от универсальных средств форматирования времени выполнения. И в то время как они очень похожи на использование, XmlSerializer не реализует интерфейс IFormatter. У Вас не может быть кода, который позволяет Вам просто загружать средство форматирования сериализации или во время выполнения между BinaryFormatter, XmlSerializer или пользовательским средством форматирования, не переходя через некоторые дополнительные обручи.
Немного менее очевидный - то, что производительность довольно плоха для Сериализации объекта.
Время, чтобы сериализировать и десериализовать 100 000 объектов на моей машине:
Time Elapsed 3 ms
Full Serialization Cycle: BinaryFormatter Int[100000]
Time Elapsed 1246 ms
Full Serialization Cycle: BinaryFormatter NumberObject[100000]
Time Elapsed 54 ms
Full Serialization Cycle: Manual NumberObject[100000]
В этом простом примере, сериализирующем объект с единственным Int, поле берет 20x медленнее, чем выполнение его вручную. Предоставленный, в сериализованном потоке существует некоторая информация о типе. Но это едва составляет 20X замедление.
Сериализируемые типы должны быть украшены [сериализуемым] атрибутом.
Если Вы имеете в виду переменные в классе, Вы неправы. Общедоступные переменные/свойства автоматически сериализируются
Я согласен с последним ответом. Производительность довольно низкая.
Недавно моя команда программистов завершила преобразование моделирования из стандартного C ++ в C ++ / CLI. В C ++ у нас был рукописный механизм устойчивости, который работал достаточно хорошо. Мы решили использовать механизм сериализации, а не переписывать старый механизм устойчивости.
Старая симуляция с объемом памяти от 1/2 до 1 гигабайта и большинством объектов, имеющих указатели на другие объекты, и тысячами объектов во время выполнения, сохранится в двоичном файле размером примерно от 10 до 15 мегабайт. менее чем за минуту. Восстановление из файла было сопоставимым.
При использовании одних и тех же файлов данных (работающих параллельно) производительность C ++ / CLI примерно в два раза выше C ++, пока мы не выполним постоянство (сериализацию в новой версии). занимает от 3 до 5 минут, чтение - от 10 до 20.Размер сериализованных файлов примерно в 5 раз больше размера старых файлов.
В основном мы видим 19-кратное увеличение времени чтения и 5-кратное увеличение времени записи. Это недопустимо, и мы ищем способы исправить это.
Изучая двоичные файлы, я обнаружил несколько вещей: 1. Тип и данные сборки записываются в виде открытого текста для всех типов. Это неэффективно с точки зрения пространства. 2. Для каждого объекта / экземпляра каждого типа записана раздутая информация о типе / сборке. Одна вещь, которую мы сделали в нашем механизме устойчивости, - это выписали таблицу известных типов. Когда мы обнаружили типы в письменной форме, мы проверили их наличие в этой таблице. Если он не существовал, была создана запись с информацией о типе и присвоенным индексом. Затем мы передали тип infor как целое число. (тип, данные, тип, данные) Этот «трюк» значительно сократит размер. Это может потребовать прохождения данных дважды, однако может быть разработан процесс «на лету», где, помимо добавления их в таблицу, отправка в поток, если мы можем гарантировать порядок повторной обработки из потока. .
Я надеялся повторно реализовать некоторую сериализацию ядра, чтобы оптимизировать ее таким образом, но, увы, классы запечатаны! Возможно, мы еще найдем способ его подстроить.