0

这应该是可能的,但是我使用WCF ISerializable 接口概念进行了广泛搜索,但没有找到答案。希望高手能帮忙。

我读过的任何文档都指 info.AddValue(...) 类似于https://docs.microsoft.com/en-us/dotnet/api/system.runtime.serialization.iserializable?view=中的概念网络框架-4.8

总之,我有一个软件,它可以在单个 EXE 中执行图像处理等操作。我想使用 WCF 服务/客户端方法,并在同一台 PC 或不同 PC 上的单独服务上进行此处理。那么基本上分配过程。

我有一个带有端点的 WCF 服务,连接并与服务通信等,这里都很好。

我想将在客户端上创建的类的整个对象(及其局部变量/对象)发送到服务。

我有从ISerializable接口派生的类。类属性是[Serializable]。 它具有所需的构造函数 & GetObjectData() public Foo(SerializationInfo info, StreamingContext context) public void GetObjectData(SerializationInfo info, StreamingContext context)

使用BinaryFormatter将此对象序列化为byte[] 并发送。在服务端,它被反序列化为类对象。

在序列化期间,它确实进入GetObjectData()并完成其任务。但是在反序列化过程中,我得到的类对象只是默认对象而不是发送的对象,局部变量/对象未初始化。

这个类对象不是一个单例,我也不希望这样,因为在单独的线程上有很多这样的实例。我认为不必对类的每个参数都进行 Addvalue。由于这只是我所指的一个类,最终我必须发送许多这样的类对象。

我尝试使用 GetRealObject() 使用具有IObjectReference接口概念的辅助类--> 但是如何从中获取原始对象?

我读过关于代理的文章,关于如何发送一个类的整个对象也没有很好的例子。

我想要这个类的整个对象在服务端。

希望我清楚我的问题。我是 WCF concpts 的新手,我可能错过了一些使这项工作成功的秘密。

请提出任何想法!

示例代码,这是我想做的基本版本。

我需要已经执行 Add() 的 cls2 对象,因此 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.
    }
}
4

0 回答 0