How to use Custom Serialization or Deserialization in WCF to force a new instance on every property of a datacontact ?

后端 未结 1 1067
悲&欢浪女
悲&欢浪女 2020-12-01 17:22

I have a datacontact with many members that has a custom class

I would like to force a new instance if the property is null on deserialization.

is there a wa

相关标签:
1条回答
  • 2020-12-01 17:51

    If your are using DataContract serialization then you can override its default behaviour using the OnDeserialized attribute.

    From MSDN: When applied to a method, specifies that the method is called during deserialization of an object in an object graph. The order of deserialization relative to other objects in the graph is non-deterministic.

    Here is my sample code:

    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();
      }
    }
    
    0 讨论(0)
提交回复
热议问题