首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-11-29 
请教一个WCF生成元数据的问题,跟DataTable有关大家好,我直接上代码了namespace DAL{[DataContract]public

请教一个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,同时给服务端和客户端调用,那样最容易,即使无法调用的情况,定义也直接复制服务端的,原封不动复制过来,不要用自动生成工具,那种功能只是让你入门而已,知道了原理后就可以扔掉的。

热点排行