DataContract, default DataMember value

后端 未结 3 1770
醉梦人生
醉梦人生 2021-02-18 18:07

Is there a way to choose default values of attributes that are not in the xml file during deserialization?
If the mAge attribute is not present in the xml file,

3条回答
  •  醉梦人生
    2021-02-18 19:04

    You can use [OnDeserialized]

    Use the OnDeserializedAttribute when you need to fix values on a deserialized object after it has been deserialized and before the graph is returned.

    [DataContract]
     public class Person 
      {
        public Person ()
        {
        }
        [DataMember(Name = "Name")]
        public string mName { get; set; }
        [DataMember(Name = "Age")]
        public int mAge { get; set; }
        [DataMember(Name = "Single")]
        public bool mIsSingle { get; set; }
    
    
    
        [System.Runtime.Serialization.OnDeserialized]
        void OnDeserialized(System.Runtime.Serialization.StreamingContext c)
        {
          mAge = (mAge == 0) ?18:mAge;
        }
      }
    }
    

    EDIT: From your Comments

    For bool or int you can use nullable bool and nullable int so if these age and Single attributes are missing in xml file then they will be null as well.

    here is quick sample I prepared

    using System.Runtime.Serialization;
    using System.ServiceModel;
    using MySpace;
    using System.ServiceModel.Channels;
    using System;
    namespace MySpace
    {
    
     [DataContract]
     public class Person 
      {
        public Person ()
        {
        }
        [DataMember(Name = "Name")]
        public string mName { get; set; }
        [DataMember(Name = "Age")]
        public int? mAge { get; set; }
        [DataMember(Name = "Single")]
        public bool? mIsSingle { get; set; }
    
    
    
        [System.Runtime.Serialization.OnDeserialized]
        void OnDeserialized(System.Runtime.Serialization.StreamingContext c)
        {
          mAge =  (mAge == null ? 18 : mAge);
        }
      }
    }
    [ServiceContract]
    public interface IService
    {
      [OperationContract]
      Person Method(Person dd);
    }
    
    public class Service : IService
    {
      public Person Method(Person 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 fac = new ChannelFactory(binding);
        fac.Open();
        IService proxy = fac.CreateChannel(new EndpointAddress(Url));
        Person d = new Person();
        d.mName = "BuzBuza";
    
        Console.WriteLine("Data before calling service " + (d.mAge == null ? " null " : d.mAge.Value.ToString()));
        Console.WriteLine("Data before calling service " + (d.mIsSingle == null ? "null" : d.mIsSingle.Value.ToString()));
        d = proxy.Method(d);
        fac.Close();
        host.Close();
        Console.WriteLine("Data after calling service " + (d.mAge == null ? " null " : d.mAge.Value.ToString()));
        Console.WriteLine("Data after calling service " + (d.mIsSingle == null ? "null" : d.mIsSingle.Value.ToString()));
    
        Console.ReadLine();
      }
    }
    

提交回复
热议问题