寻找序列化方法或常量的变通方法

时间:2013-04-19 17:34:48

标签: c# wcf serialization

显然我的教育失败了,因为我没有意识到C#中的方法无法序列化。 (很高兴知道。)

我正在尝试创建一个返回我创建的简单类的WCF服务。问题是这个简单的类包含我想要公开的方法,并且我的服务的调用者将无法访问它们(假设它们没有包含类声明的.dll)。

public class Simple
{
    public string Message { get; set; }
    private const string _Hidden = "Underpants";

    public string Hidden
    {
        get { return _Hidden; }
    }

    public string GetHidden()
    {
        return _Hidden;
    }
}

我设置了一个WCF服务(让我们称之为MyService)来返回我的Simple类的实例。令我沮丧的是,我只是部分建立了我的班级。

public void CallService()
{
    using (var client = new MyService.Serviceclient())
    {
        Simple result = client.GetSimple();
        string message = result.Message; // this works.
        string hidden = result.Hidden;  // this doesn't.
        string fail = result.GetHidden(); // Underpants remains elusive.
    }
}

是否有任何类型的解决方法,我可以在我的班级设置属性或方法,任何人都可以访问我的服务?如何处理在仅存在于服务中的类中设置的常量或其他方法?

4 个答案:

答案 0 :(得分:3)

通常,您会创建三个不同的项目。

 1. Service project
 2. Client project 
 3. Data project

Data项目仅包含数据类 - 没有应用程序代码。这些数据类中的方法和常量应独立于服务/客户端项目。 Data项目作为参考包含在Service和Client项目中,以便对同一个二进制文件进行序列化和反序列化 - 您可以保留常量/方法/等。

这里的缺点是,您的所有客户都必须是.NET应用程序,或者您必须为您希望支持的每个平台提供不同的数据库。

答案 1 :(得分:2)

据我所知,WCF服务中唯一可以返回的内容是基元或具有公共属性的类,这些属性对它们有get方法。从高级别WCF开始,允许您指定客户端和服务器之间的合同,理论上它与传输无关(即,您可以为netTcp端点交换HTTP端点,并且服务将从合同级别以相同的方式运行)。

接下来要回答的问题是您尝试在此服务呼叫中传回的数据。如果它是一个名为simple的对象,带有Message和Hidden的数据点,那么我建议创建一个名为Simple的数据类,它将这些值作为属性:

[DataContract]
public class Simple
{
    [DataMember]
    public string Hidden { get; set; }

    [DataMember]
    public string Message { get; set; }
}

当客户端收到回复消息时,将在服务器端使用您设置其值的任何内容填充“隐藏”和“隐藏”。

DataMember属性只能用于属性和字段。这意味着WCF响应只能序列化这些类型。

如果你真的只想在你的WCF合约中使用const你可以将它转换为字段并在其上放置DataMember属性:

public class Simple
{
    [DataMember]
    public string Message { get; set; }

    [DataMember]
    public const string Hidden = "Underpants";
}

为了能够这样做,必须可以访问该字段(公共)。

答案 2 :(得分:1)

DataMember attribute添加到您的媒体资源中。为此,您必须同时定义getset

[DataMember]
public string Hidden
{
    get { return _Hidden; }
    set { }
}

答案 3 :(得分:1)

技术上你可以做

public class thingToSerialize{
    public Func<ArgType1,ArgType2...,ReturnType> myFunction{get;set;}
}

然后为它分配一个lambda,它接受参数并返回返回类型 在序列化之前