序列化与反序列化问题~~!无法找到程序集...

tianrui456 2009-07-09 10:42:03
项目中的DAL和BLL都分别做好生成了dll文件,在DAL层我有个对象序列化的定态类 Serializable 提供一个2进制序列化函数 和反2进制序列化函数 在各自的层中测试的时候 一切正常.
但是我把 这2个dll放到webservice中去的时候 发现 虽然传回来的2进制数据正确(和原来在DAL层测试的2机制数据一样) 但是在反序列化的时候 它总是提示 找不到程序集"utc Version=1.0.4.12, Culture=neutral, PublicKeyToken=null" 这个怎么解决啊??? 急 真的很急啊..... 请达达们给个指示 小弟先谢谢了...
...全文
1294 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
One_knight 2012-05-18
  • 打赏
  • 举报
回复
我也遇到这个问题了“mytest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”。真是头大,也是服务器客户端的,你解决了没。。。
kouchao 2012-01-12
  • 打赏
  • 举报
回复
我今天也遇到了这个问题,序列化和反序列化我必须要做在两个类库里,这个怎么办呢?
liushengmz 2009-12-22
  • 打赏
  • 举报
回复
我自己也测试了一下,如果客户端和服务端都引用这个类库的DLL,那么就不出这个问题,这个DLL的命名空间不能更改啊。反正我自己的就解决了问题了,不知你的怎么样了
liushengmz 2009-12-22
  • 打赏
  • 举报
回复
楼主有没有解决啊?有解决的就放下来给大伙看看啊
gaojunle 2009-07-27
  • 打赏
  • 举报
回复
你这个问题我也遇到类似的了.不过我还没有解决,但是大概思路是想这样就是建立一个类库做为中间媒介,用来序列化和反序列化,我们之所以遇到这个问题大概是出在程序集名不一致上..你可以打开一个序列化的文件打开看一下,里面把命名空间什么的都保存来,所以在两个应用程序中使用时会有问题..我们建立一个类库是不是可以解决问题啊!!你要是已经解决了,请提供一点思路啊.谢谢!!
tianrui456 2009-07-09
  • 打赏
  • 举报
回复
绝对没有, 我的 DLL做好以后才做了个测试的工程 mTest 由于序列化出问题 我才把 DAL层的源码复制到mTest中去测试 在用DLL的时候 会出现问题,但用源码 就一切正常....
  • 打赏
  • 举报
回复
建议你在你的dal代码全局的搜索下“mTest”关键字。看是不是使用了这个命名空间
  • 打赏
  • 举报
回复
隐约感觉你的这个dll 反向引用了mtest的东西
tianrui456 2009-07-09
  • 打赏
  • 举报
回复
默认的命名空间都是 一样的UnitedTransit, DAL层使用的是 UnitedTransit.DAL BLL层使用UnitedTransit.BLL 公用类使用UnitedTransit.Comm 签名的时候用的同一个key 生成各自的DLL以后我就放到现在的webservice中 但是就是出现这个问题..
还有个问题是 我用以前测试 DAL层的工程 mTest, 我在调试WebService的时候 报错的竟然是
"mTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”。我不的其解啊.....

带上我的序列化代码吧

[Serializable]
public class SerDbObj
{
public string ColumnName;
public object Value;
public SerDbObj(string cName, object value)
{
ColumnName = cName;
Value = value;
}
}

public class UBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
System.Reflection.Assembly ass = System.Reflection.Assembly.GetExecutingAssembly();
return ass.GetType(typeName);
}
}

/// <summary>
/// 用于序列化和反序列化对象
/// </summary>
public static class Serializable
{
/// <summary>
/// 将DBObject对象序列化成2进制数组
/// </summary>
/// <param name="a">要序列化的DBObject</param>
/// <returns>序列化成功以后返回数组,失败返回null</returns>
public static byte[] SerializabeDBobj(DBObjectBase a)
{
MemoryStream ms = new MemoryStream();
if (a == null) return null;
try
{

List<SerDbObj> abcd = new List<SerDbObj>();

foreach (DBObjectMeta x in a.ValuedColumns())
{
SerDbObj newB = new SerDbObj(x.Name, x.Value);
abcd.Add(newB);
}

BinaryFormatter fb = new BinaryFormatter();

byte[] myData;
fb.Serialize(ms, abcd);
myData = ms.ToArray();
return myData;
}
catch
{
return null;
}
}

/// <summary>
/// 使用2进制化后的数据反序列化获取DBObject对象
/// </summary>
/// <param name="bs">要反序列化的2进制数组</param>
/// <param name="c">要反序列化的类型</param>
/// <returns>如果失败将返回null</returns>
public static DBObjectBase DeSerializabeDBobj(byte[] bs, string tabName)
{

try
{
MemoryStream ms = new MemoryStream(bs);
BinaryFormatter fb = new BinaryFormatter();
fb.Binder = new UBinder();
List<SerDbObj> newTab = (List<SerDbObj>)fb.Deserialize(ms);
ms.Close();
DBObjectBase a = UnitedTransitResolution.DAL.DBObjectFactory.Create(tabName);

foreach (SerDbObj x in newTab)
{
a[x.ColumnName, 1].Value = x.Value;
}


return a;
}
catch
{
return null;
}
finally
{

}

}

  • 打赏
  • 举报
回复
你序列化和饭序列化都在webservice里?

还是你序列化在webservice,而反序列化在调用webservice的地方?
soaringbird 2009-07-09
  • 打赏
  • 举报
回复
各个dll的命名空间是否一致?
tianrui456 2009-07-09
  • 打赏
  • 举报
回复
来个人给我看看啊 谢谢了... 这个比较急的.. 急死了..
tianrui456 2009-07-09
  • 打赏
  • 举报
回复
来个人给我看看啊 谢谢了... 这个比较急的..
tianrui456 2009-07-09
  • 打赏
  • 举报
回复
我的DAL层 一切正常 在单独的测试工程中(没生成dll,使用源文件) 没有任何异常 也可以序列化和反序列化 但生成DLL以后 序列化可以用反序列化就 不行了.
yanlong521521 2009-07-09
  • 打赏
  • 举报
回复
如果你的DAL生成有问题的话,不能正常引用,你试下先删掉引用,生成过再重新添加试下。
tianrui456 2009-07-09
  • 打赏
  • 举报
回复
肯定是有的 我直接把整个DAL层的dll引用到了 现在做的这个webservice中了
soaringbird 2009-07-09
  • 打赏
  • 举报
回复
被序列化的那个类的程序集在反序列化的地方有吗?
tianrui456 2009-07-09
  • 打赏
  • 举报
回复
来人阿 我顶起来,....
tianrui456 2009-07-09
  • 打赏
  • 举报
回复
我的客户端 也是使用的这个 DAL 和BLL层的dll 它们的类应该是一样的.. 我用反射调试出来 我那个测试工程的 那个对象反射信息竟然是:UnitedTransit.Comm.SerDbObj,(注意这是个逗号)mTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

而我的webservice中是 UnitedTransit.Comm.SerDbObj,Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tianrui456 的回复:]
刚实验过了 果然和序列化的地方有关系 我在webservice中序列化的东西,然后再在webservice中反序列化就没问题.........
  但是我的序列化的工作要在客户端做的啊,然后传到服务器存数据库 然后在通过webservice再反序列化后处理的 这个怎么解决啊???
[/Quote]
呵呵,果然还是我猜对了,你的饭序列化不在webservice里。

不知道你的客户端是什么,只要是v.net的就好办,你自己封装client后给客户端用就可以了,client里包含了饭序列化的逻辑就可以了。
加载更多回复(3)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧