serialize data c# wcf datacontract datamember

c# - serialize - import datacontract



DataContract, valor predeterminado de DataMember (3)

Esto debería funcionar.

[DataContract] public class Person { public Person () { } [DataMember(Name = "Name")] public string mName { get; set; } [DataMember(Name = "Age")] public int mAge = 18; [DataMember(Name = "Single")] public bool mIsSingle { get; set; } };

Echa un vistazo a this página.

¿Hay alguna forma de elegir los valores predeterminados de los atributos que no están en el archivo xml durante la deserialización?
Si el atributo mAge no está presente en el archivo xml, quiero usar un valor predeterminado de 18. ¿Es posible?

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

Editar para poner la respuesta.

[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); // 18 is the default value } }


Puedes usar [OnDeserialized]

Utilice el atributo OnDeserializedAttribute cuando necesite corregir valores en un objeto deserializado después de haberlo deserializado y antes de que se devuelva el gráfico.

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

EDITAR: De tus comentarios

Para bool o int puede usar [OnDeserialized] por lo que si faltan estos atributos de Single y Single en el archivo xml, también serán nulos.

Aquí está la muestra rápida que preparé

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<IService> fac = new ChannelFactory<IService>(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(); } }


utilizar [OnDeserializing()]

y establece sus valores ANTES de la deserialización. Por lo tanto, no es necesario realizar ninguna verificación, lo que podría salir mal. ¿Qué sucede si el mAge se serializó para ser 0?