Сериализация Wcf с использованием интерфейса iserializable
Это должно быть возможно, однако я тщательно искал и не нашел ответов на этот вопрос, используя концепцию интерфейса WCF ISerializable. Надеюсь, эксперты смогут помочь.
Любая документация, которую я прочитал, относится только к концепции info.AddValue (...), аналогичной тем, что есть в https://docs.microsoft.com/en-us/dotnet/api/system.runtime.serialization.iserializable?view=netframework-4.8
Таким образом, у меня есть SW, который выполняет такие операции, как обработка изображений в одном EXE-файле. Я хотел бы использовать подход WCF Service/Client и выполнять эту обработку на отдельных сервисах на одном ПК или разных ПК. Ну в основном распределите процесс.
У меня есть служба WCF с конечными точками, подключается и связывается со службами и т. д., Все здесь хорошо.
Я хочу отправить весь объект класса(с его локальными переменными/объектами), который был создан на клиенте, в службу.
У меня есть класс, производный от интерфейса ISerializable. Атрибут класса-это [сериализуемый]. Она имеет требуется конструктор &амп; метод GetObjectData() публичных Фу(информация SerializationInfo, StreamingContext контекстные) общественного недействительными метод GetObjectData(SerializationInfo информация, StreamingContext контекстные)
Этот объект сериализуется с помощью BinaryFormatter в байт[] и отправляется. На стороне службы он десериализуется в объект класса.
Во время сериализации он действительно входит в GetObjectData() и выполняет свою задачу. Но во время десериализации объект класса, который я получаю, является просто объектом по умолчанию, а не объектом, который был отправлен, локальные переменные/объекты не инициализируются.
Этот объект класса не является синглтоном, и я не хочу этого делать, так как существует много экземпляров этого класса в отдельных потоках. Я бы подумал, что не нужно делать Addvalue для каждого параметра класса. Поскольку это всего лишь один класс, на который я ссылаюсь, в конечном итоге мне придется отправить много таких объектов класса.
Я пробовал использовать вспомогательный класс с концепцией интерфейса IObjectReference, используя GetRealObject() --> Но как я могу получить исходный объект из этого?
Я читал о суррогатах, опять же нет хорошего примера о том, как отправить весь объект класса.
Я хочу, чтобы весь объект этого класса был на стороне обслуживания.
Классы, которые я хочу отправить, намного больше и сложнее, чем 2 Int, в нем есть объекты других классов, словари и т. д. Дело в том, как получить объект этого класса, кажется, что он находится в объекте SerializationInfo, но не может найти способ его получить
Надеюсь, я ясно сформулировал свой вопрос. Я новичок в WCF conecpts, мне, вероятно, не хватает какого-то секрета, чтобы сделать эту работу.
Пожалуйста, предложите любые идеи!
Что я уже пробовал:
Пример кода, это базовая версия того, что я хочу сделать.
Мне нужен объект cls2, который уже выполнил Add (), таким образом, num1 & num2 обновляются, чтобы быть полученным на стороне сервиса с правильными значениями Add (), такими как 100 & 200. ImgProcessingConnector() обрабатывает все данные для подключения к сервису.
клиент WCF
public Form1() { InitializeComponent(); cls2 = new Class2(); } private void button1_Click(object sender, EventArgs e) { byte[] cls2Byted = Class1.SerializedtoByte(cls2); ImgProcessingConnector.Instance().PerformAction(cls2Byted); } Class2 cls2 = null;
служба WCF
public class ImageProcessingWCFService : IImageProcessingWCFService { public ImageProcessingWCFService() { } public bool PerformAction(byte[] cls2Byted) { Class2 cls2 = Class1.DeSerializedfromByte(cls2Byted) as Class2; cls2.Subtract(); return true; } }
Класс2
[Serializable] public class Class2 : ISerializable { public Class2() { Add(); } public Class2(SerializationInfo info, StreamingContext context) { } public void Add() { num1 = 50 + 50; num2 = 100 + 100; } public void Subtract() { num1 = 50 - 50; num2 = 100 - 100; } int num1; int num2; public void GetObjectData(SerializationInfo info, StreamingContext context) { //nothing to do send ALL. } }
johannesnestler
просто используйте сериализатор datacontract WCF default (просто не делайте ничего особенного в своем DTO-классе) - так что все должно вести себя естественно. Почему вы придумали (старую) Сериализуемую идею…