昨日发现项目组成员中有几台出现无法序列化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 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;
}
}
构造一个类似这样的方法
{
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.
分享心得:总觉得有更好的方法,但现在只能采用这样的方法了.
