基于WCF PARAMS系列化定制 [英] WCF Custom serialization based on params

查看:218
本文介绍了基于WCF PARAMS系列化定制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以实现一些自定义的序列化(SOAP)来序列仅领域至极可以动态改变



类:



  [DataContract] 
公共类视频
{
...

[数据成员]
公众诠释宽度{获得;组; }

[数据成员]
公众诠释身高{获得;组; }

[数据成员]
公共短比特率{搞定;组; }

[数据成员]
公共短帧率{搞定;组; }

[数据成员]
公众持续时间长{搞定;组; }

[数据成员(EmitDefaultValue = FALSE)]
公众的VideoType类型{搞定;组; }
}



WCF方法:



 公共视频GetPartVideo(PARAMS字符串[]字段)
{
变种视频=新的视频
{
NAME =测试视频,
说明=测试视频的说明,
CreatedAt = DateTime.Now,
ModifiedAt = DateTime.Now,
URL =
文件名=,
文件大小= 100,
宽度= 640,
高度= 480,
比特率= 120,
帧率= 32 ,
持续时间= 100200300,
类型= VideoType.StandardDefinition
};

返回视频;
}



方法调用:



 < GetPartVideo> 
< MethodParameters>
<田attr0 =字符串数组的isNull =false的>
< StringArray0>名称和LT; / StringArray0>
< StringArray1>说明与LT; / StringArray1>
< /田>
< / MethodParameters>
< / GetPartVideo>



SOAP响应(简体):



 < GetPartVideo> 
< MethodParameters>
<视频>
<说明>在测试视频和LT的说明; /说明>
<名称>测试影片版权< /名称>
< /视频>
< / MethodParameters>
< / GetPartVideo>


解决方案

我发现我自己的反应。



有可能使用串行格式属性,改变系列化

 公共类CustomDataContractSerializerOperationBehavior:DataContractSerializerOperationBehavior 
{
公共CustomDataContractSerializerOperationBehavior(OperationDescription operationDescription):基地(operationDescription){}

公众覆盖XmlObjectSerializer CreateSerializer(类型类型,字符串名称,字符串NS, IList的<类型> knownTypes)
{
变种字典=新XmlDictionary(2);
dictionary.Add(名);
dictionary.Add(NS);


返回新MyCustomDataContractSerializer(
型,
新XmlDictionaryString(字典,姓名,0),
新XmlDictionaryString(字典,NS,1),
knownTypes);
}

公众覆盖XmlObjectSerializer CreateSerializer(类型类型,XmlDictionaryString名,XmlDictionaryString NS,IList的<类型> knownTypes)
{
返回新MyCustomDataContractSerializer(
类型,
的名字,
NS,
knownTypes);
}
}


公共类CustomDataContractFormatAttribute:属性,IOperationBehavior
{
公共无效AddBindingParameters(OperationDescription描述,BindingParameterCollection参数)
{
}

公共无效ApplyClientBehavior(OperationDescription描述,ClientOperation代理)
{
ReplaceDataContractSerializerOperationBehavior(介绍);
}

公共无效ApplyDispatchBehavior(OperationDescription描述,DispatchOperation派遣)
{
ReplaceDataContractSerializerOperationBehavior(介绍);
}

公共无效验证(OperationDescription描述)
{
}

私有静态无效ReplaceDataContractSerializerOperationBehavior(OperationDescription描述)
{
DataContractSerializerOperationBehavior DCS = description.Behaviors.Find< DataContractSerializerOperationBehavior>();

如果(DCS!= NULL)
description.Behaviors.Remove(DCS);

description.Behaviors.Add(新CustomDataContractSerializerOperationBehavior(介绍));
}
}



也是类MyCustomDataContractSerializer应覆盖XmlObjectSerializer



和服务可以用自定义格式加以装饰属性。

  [的ServiceContract(命名空间=http://tesmpuri.com/)] 
[ServiceKnownType(typeof运算(视频))]
公共接口IPartialResponseTestService
{
[OperationContract的]
。视频GetFullVideo();

[OperationContract的]
[CustomDataContractFormat]
视频GetPartVideo(PARAMS字符串[]字段);

[OperationContract的]
[XmlSerializerFormat]
视频GetVideo();
}


Can I implement some custom serialization (SOAP) to serialize only the fields wich can be changed dynamically

Class:

[DataContract]
public class Video
{
    ...

    [DataMember]
    public int Width { get; set; }

    [DataMember]
    public int Height { get; set; }

    [DataMember]
    public short Bitrate { get; set; }

    [DataMember]
    public short Framerate { get; set; }

    [DataMember]
    public long Duration { get; set; }

    [DataMember(EmitDefaultValue = false)]
    public VideoType Type { get; set; }
}

WCF Method:

public Video GetPartVideo(params string[] fields)
{
    var video = new Video
    {
        Name = "Test Video",
        Description = "Description of the Test Video",
        CreatedAt = DateTime.Now,
        ModifiedAt = DateTime.Now,
        Url = "",
        FileName = "",
        FileSize = 100,
        Width = 640,
        Height = 480,
        Bitrate = 120,
        Framerate = 32,
        Duration = 100200300,
        Type = VideoType.StandardDefinition
    };

    return video;
} 

Method call:

<GetPartVideo>
  <MethodParameters>
    <fields attr0="StringArray" isNull="false">
      <StringArray0>Name</StringArray0>
      <StringArray1>Description</StringArray1>
    </fields>
  </MethodParameters>
</GetPartVideo>

SOAP Response (simplified):

<GetPartVideo>
  <MethodParameters>
    <Video>
      <Description>Description of the Test Video</Description>
      <Name>Test Video</Name>
    </Video>
  </MethodParameters>
</GetPartVideo>

解决方案

I have found the response by myself.

It is possible to use Serializer Format Attribute, to change serialization

public class CustomDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior
{
    public CustomDataContractSerializerOperationBehavior(OperationDescription operationDescription) : base(operationDescription) { }

    public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
    {
        var dictionary = new XmlDictionary(2);
        dictionary.Add(name);
        dictionary.Add(ns);


        return new MyCustomDataContractSerializer(
            type,
            new XmlDictionaryString(dictionary, name, 0),
            new XmlDictionaryString(dictionary, ns, 1), 
            knownTypes);
    }

    public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
    {
        return new MyCustomDataContractSerializer(
            type,
            name,
            ns,
            knownTypes);
    }
}


public class CustomDataContractFormatAttribute : Attribute, IOperationBehavior
{
    public void AddBindingParameters(OperationDescription description, BindingParameterCollection parameters)
    {
    }

    public void ApplyClientBehavior(OperationDescription description, ClientOperation proxy)
    {
        ReplaceDataContractSerializerOperationBehavior(description);
    }

    public void ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch)
    {
        ReplaceDataContractSerializerOperationBehavior(description);
    }

    public void Validate(OperationDescription description)
    {
    }

    private static void ReplaceDataContractSerializerOperationBehavior(OperationDescription description)
    {
        DataContractSerializerOperationBehavior dcs = description.Behaviors.Find<DataContractSerializerOperationBehavior>();

        if (dcs != null)
            description.Behaviors.Remove(dcs);

        description.Behaviors.Add(new CustomDataContractSerializerOperationBehavior(description));
    }
}

also the class MyCustomDataContractSerializer should override the XmlObjectSerializer

and Service can be decorated with the custom format attributes

[ServiceContract(Namespace = "http://tesmpuri.com/")]
[ServiceKnownType(typeof(Video))]
public interface IPartialResponseTestService
{
    [OperationContract]
    Video GetFullVideo();

    [OperationContract]
    [CustomDataContractFormat]
    Video GetPartVideo(params string[] fields);

    [OperationContract]
    [XmlSerializerFormat]
    Video GetVideo();
}

这篇关于基于WCF PARAMS系列化定制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆