读书人

请问一个WCF生成元数据的有关问题跟

发布时间: 2013-11-29 00:21:24 作者: rapoo

请教一个WCF生成元数据的问题,跟DataTable有关
大家好,我直接上代码了


namespace DAL
{

[DataContract]
public class OperationExecuteEventArgs : EventArgs
{

private string _message = string.Empty;
private System.Data.DataTable _dataTable = null;

//[DataMember]
public System.Data.DataTable DataTable
{
get { return _dataTable; }
set { _dataTable = value; }
}

[DataMember]
public string Message
{
get { return _message; }
set { _message = value; }
}
}
}


这是一个很简单的DataContract,其中的DataTable我没有把它标记为DataMember,生成的元数据是这个样子的:

namespace DAL
{
using System.Runtime.Serialization;


[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="OperationExecuteEventArgs", Namespace="http://schemas.datacontract.org/2004/07/DAL")]
public partial class OperationExecuteEventArgs : System.EventArgs, System.Runtime.Serialization.IExtensibleDataObject
{

private System.Runtime.Serialization.ExtensionDataObject extensionDataField;

private string MessageField;

public System.Runtime.Serialization.ExtensionDataObject ExtensionData
{
get
{
return this.extensionDataField;
}
set
{
this.extensionDataField = value;
}
}

[System.Runtime.Serialization.DataMemberAttribute()]
public string Message
{
get
{
return this.MessageField;
}
set
{
this.MessageField = value;
}
}
}
}

元数据中还有一些接口我就不复制了
然后我把DataTable标记为DataMember,得到的元数据结构就不一样了:


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.datacontract.org/2004/07/DAL")]
public partial class OperationExecuteEventArgs : EventArgs
{

private System.Data.DataTable dataTableField;

private string messageField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=0)]
public System.Data.DataTable DataTable


{
get
{
return this.dataTableField;
}
set
{
this.dataTableField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=1)]
public string Message
{
get
{
return this.messageField;
}
set
{
this.messageField = value;
}
}
}


连命名空间都没有了,接口里的一些方法定义也改变了,服务端的改动仅仅是加了一个DataMember
请问有什么办法可以让它保持上面一种结构,先谢谢了!
[解决办法]
原则上,去掉[DataMember]后,改字段或属性将不会参与序列化,根本就不会生成任何信息,除非你连同[DataContract]也一起去掉,则会自动对所有public的属性进行序列化。
那种奇怪的现象要问svcutil工具了,你觉得不爽自己写一个类似的工具来处理,或者手动写客户端类型处理,没必要用它提供的,理解为小BUG会更容易接受。事实上所有的自定义类型都应该封装为单独的dll,同时给服务端和客户端调用,那样最容易,即使无法调用的情况,定义也直接复制服务端的,原封不动复制过来,不要用自动生成工具,那种功能只是让你入门而已,知道了原理后就可以扔掉的。

读书人网 >C#

热点推荐