WCF基于params的自定义序列化

我是否可以实现一些自定义序列化(SOAP)来仅序列化可以动态更改的字段

类:

[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方法:

 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; } 

方法调用:

    Name Description    

SOAP响应(简化):

      

我自己找到了回应。

可以使用Serializer Format Attribute来更改序列化

 public class CustomDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior { public CustomDataContractSerializerOperationBehavior(OperationDescription operationDescription) : base(operationDescription) { } public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList 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 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(); if (dcs != null) description.Behaviors.Remove(dcs); description.Behaviors.Add(new CustomDataContractSerializerOperationBehavior(description)); } } 

类MyCustomDataContractSerializer也应该重写XmlObjectSerializer

和服务可以使用自定义格式属性进行修饰

 [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(); }