Как использовать пользовательскую сериализацию или десериализацию в WCF, чтобы принудительно создать новый экземпляр для каждого свойства datacontact?

У меня есть datacontact со многими членами, которые имеют собственный class

Я хотел бы заставить новый экземпляр, если свойство имеет нулевое значение для десериализации.

Есть ли способ сделать это?

Если вы используете сериализацию 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 fac = new ChannelFactory(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(); } } 
  • Keycloak извлекает пользовательские атрибуты для KeycloakPrincipal
  • Давайте будем гением компьютера.