如何在 WCF 中使用自定义序列化或反序列化来强制在 datacontact 的每个属性上创建一个新实例?

Posted

技术标签:

【中文标题】如何在 WCF 中使用自定义序列化或反序列化来强制在 datacontact 的每个属性上创建一个新实例?【英文标题】:How to use Custom Serialization or Deserialization in WCF to force a new instance on every property of a datacontact ? 【发布时间】:2011-12-26 11:00:35 【问题描述】:

我与许多具有自定义类的成员有一个数据联系人

如果反序列化时属性为空,我想强制一个新实例。

有没有办法做到这一点?

【问题讨论】:

这就是为什么 DTO 很适合拥有的原因(也使架构中的升级/更改更容易)。 看看:***.com/questions/2041663/wcf-service-default-values 你是指datacontact还是datacontract? 【参考方案1】:

如果您使用 DataContract 序列化,则可以使用 OnDeserialized 属性覆盖其默认行为。

来自MSDN:当应用于方法时,指定在对象图中的对象反序列化期间调用该方法。相对于图中其他对象的反序列化顺序是不确定的。

这是我的示例代码:

namespace MySpace


  public class MyCustomClass
  
    public string MyStrData  get; set; 
  

  [DataContract]
  public class Data
  
    [DataMember]
    public int mInt;

    [DataMember]
    public MyCustomClass MyCustonObj;



    [OnDeserialized]
    void OnDeserialized(StreamingContext c)
    
      if (MyCustonObj == null)
      
        MyCustonObj = new MyCustomClass();
        MyCustonObj.MyStrData = "Overridden in serialization";
      
    

    [OnDeserializing]
    void OnDeserializing(StreamingContext c)
    
      if (MyCustonObj == null)
      
        MyCustonObj = new MyCustomClass();
        MyCustonObj.MyStrData = "Overridden in  deserializing";
      
    

    [OnSerialized]
    void OnSerialized(StreamingContext c)
    
       // if you wan to  do somehing when serialized here or just remove them

    

    [OnSerializing]
    void OnSerializing(StreamingContext c)
    
       // if you wan to  do somehing during serializing here or just remove them    
    
  



[ServiceContract]
public interface IService

  [OperationContract]
  Data Method(Data dd);


public class Service : IService

  public Data Method(Data dd)
  
    return dd;
  


class Program

  static void Main(string[] args)
  
    string Url = "http://localhost:8000/";
    Binding binding = new BasicHttpBinding();
    ServiceHost host = new ServiceHost(typeof(Service));
    host.AddServiceEndpoint(typeof(IService), binding, Url);
    host.Open();
    ChannelFactory<IService> fac = new ChannelFactory<IService>(binding);
    fac.Open();
    IService proxy = fac.CreateChannel(new EndpointAddress(Url));
    Data d = new Data();
    d.mInt = 5;
    Console.WriteLine("Data before calling service " + d.mInt);
    Console.WriteLine("Data before calling service " + (d.MyCustonObj == null ? "null" : d.MyCustonObj.MyStrData));
    d = proxy.Method(d);
    fac.Close();
    host.Close();
    Console.WriteLine("Data after calling service " + d.mInt);
    Console.WriteLine("Data after calling service " + d.MyCustonObj.MyStrData);
    Console.ReadLine();
  

【讨论】:

以上是关于如何在 WCF 中使用自定义序列化或反序列化来强制在 datacontact 的每个属性上创建一个新实例?的主要内容,如果未能解决你的问题,请参考以下文章

WCF 错误“对象图中可以序列化或反序列化的最大项目数为 '65536'”

可以在对象图中序列化或反序列化的最大项目数......使用 knowtypes

如何自定义 WCF XML 序列化

如何设置 WCF 自定义反序列化错误消息

如何使用 wcf REST 服务获取自定义对象的 json 响应?

具有自定义 WCF 4.5 WebHttpBehavior 的 UriTemplates