This should be possible however I have searched extensively and have found no answers to this, using WCF ISerializable interface concept. Hopefully the experts can help.
Any documentation I have read only refers to info.AddValue(...) concept similar to the ones in https://docs.microsoft.com/en-us/dotnet/api/system.runtime.serialization.iserializable?view=netframework-4.8
In summary I have a SW which does operations like Image processing in a single EXE. I would like to use WCF Service/Client approach and do this processing on separate services on same PC or different PC's. Well basically distribute the process.
I have a WCF service with endpoints, connects & communicates to the services etc, all good here.
I want to send the entire object of a class(with its local variables/objects), which has been created on the client, across to the service.
I have the class derived from the ISerializable interface. Class attribute is [Serializable]. It has the required constructor & GetObjectData() public Foo(SerializationInfo info, StreamingContext context) public void GetObjectData(SerializationInfo info, StreamingContext context)
This object is Serialized using the BinaryFormatter to a byte[] and sent. On the service side it is Deserialized to the class object.
During Serialization it does go into GetObjectData() and does its task. BUT during deserialization the class object I get is just the default object not the object which was sent, local variables/objects are not initialized.
This class object is not a singleton, nor I want to that as there are many instances of this on separate threads. I would think one does not have to do a Addvalue on every parameter of a class. As this is just one class I referring to, eventually I have to send many such class objects.
I have tried using a helper class with IObjectReference interface concept using the GetRealObject() --> BUT how do I get the original object from this?
I have read about Surrogates, again no good exaple on how to send the entire object of a class.
I want the entire object of this class on the Service side.
The classes I want to send are much bigger and complex than 2 Int's, it has objects of other classes, dictionaries etc. point is how to get the Object of this class, it seems like it is in the SerializationInfo object BUT cannot find a way to get it out
Hope I am clear on my question. I am new to the WCF conecpts, I am probably missing some secret to make this work.
Please suggest any ideas!
What I have tried:
Example Code, this is the basic version of what I want to do.
I need cls2 object which has Add() performed already thus num1 & num2 are updated, to be received on the service side with the right values of Add() like 100 & 200. ImgProcessingConnector() is handling all the stuff for connecting to the Service.
WCF Client
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 Service
public class ImageProcessingWCFService : IImageProcessingWCFService
{
public ImageProcessingWCFService()
{
}
public bool PerformAction(byte[] cls2Byted)
{
Class2 cls2 = Class1.DeSerializedfromByte(cls2Byted) as Class2;
cls2.Subtract();
return true;
}
}
Class2
[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)
{
}
}