昨日发现项目组成员中有几台出现无法序列化OracleParameters的问题,但在我和另外几名同事的电脑上运行确很正常,于是便查找相关资料以解决问题,刚开始时根据WCF的错误提示

System.Runtime.Serialization.InvalidDataContractException: 无法序列化类型“System.Data.OracleClient.OracleParameter”。可以考虑使用 DataContractAttribute 属性对其进标注.

在接口处加上[ServiceKnowType(OracleParameter)],但是效果一样,我就开始想会不会是其它问题,但碰到此问题的DX似乎不是很多,基本上没有找到资料对相关参数进行阐述.我想会不会是出于安全问题本身就不能这样传输,但为什么我们的机器可以而别的机器确会有这样的提示?至今无解.

        说说我的传换过程吧 ^^ ,有些草率,不过时间太紧,没办法只能这样了.

先构造一个和OracleParameter具有相同公共属性名称的对象.

 

自定义参数对象
 [DataContract]
    
public class ora
    { 
        
public ora()
        { }

        
private object _DbType = "";
        [DataMember]
        
public object DbType
        {
            
get { return _DbType.ToString(); }
            
set { _DbType = value; }
        }
        
private object _Direction = "";
        [DataMember]
        
public object Direction
        {
            
get { return _Direction.ToString(); }
            
set { _Direction = value; }
        }
        
private object _IsNullable = "";
        [DataMember]
        
public object IsNullable
        {
            
get { return _IsNullable; }
            
set { _IsNullable = value; }
        }
}

 

 

服务器端还原:

 

转换相应类型
 public bool ChangProrpertiesType(string TypeName, string Value, ref object NeesChangType)
        { 
            
try
            {
                
switch (TypeName)
                {
                    
case "DbType":
                        {
                            NeesChangType 
= (DbType)Enum.Parse(typeof(DbType), Value);
                            
return true;
                        }
                    
case "Direction":
                        {
                            NeesChangType 
= (ParameterDirection)Enum.Parse(typeof(ParameterDirection), Value);
                            
return true;
                        }
                    
case "OracleType":
                        {
                            NeesChangType 
= (OracleType)Enum.Parse(typeof(OracleType), Value);
                            
return true;
                        }
}
构造一个类似这样的方法

 

 

再循环使用:  ChangProrpertiesType(FromOracleName,ParameterValue.ToString(),ref ParameterValue); 对其属进行还原便得到了相应的OracleParameter.

分享心得:总觉得有更好的方法,但现在只能采用这样的方法了.