Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WCF中使用自定义序列化或反序列化来强制datacontact的每个属性上都有一个新实例?_C#_Wcf_Customization_Deserialization_Datacontract - Fatal编程技术网

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

C# 如何在WCF中使用自定义序列化或反序列化来强制datacontact的每个属性上都有一个新实例?,c#,wcf,customization,deserialization,datacontract,C#,Wcf,Customization,Deserialization,Datacontract,我与许多拥有自定义类的成员有一个datacontact 如果反序列化时属性为null,我想强制创建一个新实例 有没有办法做到这一点?如果您使用的是DataContract序列化,那么您可以使用OnDeserialized属性覆盖其默认行为 From:应用于方法时,指定在对象图中对象的反序列化期间调用该方法。相对于图中其他对象的反序列化顺序是不确定的 以下是我的示例代码: namespace MySpace { public class MyCustomClass { publi

我与许多拥有自定义类的成员有一个datacontact

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


有没有办法做到这一点?

如果您使用的是DataContract序列化,那么您可以使用
OnDeserialized
属性覆盖其默认行为

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

以下是我的示例代码:

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();
  }
}
名称空间MySpace
{
公共类MyCustomClass
{
公共字符串MyStrData{get;set;}
}
[数据合同]
公共类数据
{
[数据成员]
公共铸币厂;
[数据成员]
公共MyCustomClass mycustomobj;
[已序列化]
void OnDeserialized(StreamingContext c)
{
if(MyCustonObj==null)
{
MyCustonObj=新的MyCustomClass();
MyCustonObj.MyStrData=“在序列化中被重写”;
}
}
[正在序列化]
无效序列化(StreamingContext c)
{
if(MyCustonObj==null)
{
MyCustonObj=新的MyCustomClass();
MyCustonObj.MyStrData=“在反序列化中被重写”;
}
}
[串行化]
void OnSerialized(StreamingContext c)
{
//如果你想在这里序列化时做些什么,或者干脆删除它们
}
[正在序列化]
void onserialization(StreamingContext c)
{
//如果您想在序列化过程中执行某些操作,请单击此处或删除它们
}
}
}
[服务合同]
公共接口设备
{
[经营合同]
数据方法(数据dd);
}
公共课服务:IService
{
公共数据方法(数据dd)
{
返回dd;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
字符串Url=”http://localhost:8000/";
Binding Binding=新的BasicHttpBinding();
ServiceHost主机=新的ServiceHost(类型(服务));
AddServiceEndpoint(typeof(IService)、绑定、Url);
host.Open();
ChannelFactory fac=新的ChannelFactory(绑定);
fac.Open();
IService proxy=fac.CreateChannel(新端点地址(Url));
数据d=新数据();
d、 薄荷=5;
Console.WriteLine(“调用服务前的数据”+d.mInt);
WriteLine(“调用服务之前的数据”+(d.MyCustonObj==null?“null”:d.MyCustonObj.MyStrData));
d=代理方法(d);
fac.Close();
host.Close();
Console.WriteLine(“调用服务后的数据”+d.mInt);
Console.WriteLine(“调用服务后的数据”+d.MyCustonObj.MyStrData);
Console.ReadLine();
}
}

这就是为什么DTO很好使用的原因(也使模式的修订/更改更容易)。看看:你是指datacontact还是datacontract?