C#在用到序列化。序列化之后的反序列化却提示“无法找到程序集” 100分求助。提示无法找到程序集。我明白了是因为“应用程序和类库的命名空间可能是不一样的,所以提示找不到程序集”,但是具体的操作是怎么操作的呢?才能反序列化成功呢?我按照下面牛人的方法试过了,但是不行。我不知道为什么。最好能详细一点,不要只是讲原理,小弟在此谢过了!http://blog.csdn.net/scgyyu/archive/2009/06/01/4232371.aspx 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 小弟是这么写的: public static object Deserialize(byte[] data) { IFormatter formatter = new BinaryFormatter(); formatter.Binder = new UBinder(); MemoryStream stream = new MemoryStream(data); //这里的错误:无法找到程序集 object obj = (object)formatter.Deserialize(stream); return obj; } 上面是反序列化的代码 public static byte[] Serialize(object obj) { System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); System.IO.MemoryStream stream = new System.IO.MemoryStream(); formatter.Serialize(stream, obj); byte[] data = stream.GetBuffer(); return data; }上面是序列化的代码 最初我是这么写的: public static object Deserialize(byte[] data) { System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); System.IO.MemoryStream stream = new System.IO.MemoryStream(data); data = null; Object obj = formatter.Deserialize(stream); return obj; }也是从网上找的代码。 DLL移至BIN文件夹后期动态加载确定AppDomain 中的所有可用程序集中包括要使用的类型 你的回答看起来很专业,而且好多勋章。我看到了可以使用dll来解决的方法。但是怎么写dll?在vs里新建一个dll的项目,写好了我需要的类之后我就不知道再怎么处理了。您能给我详细的讲一下我该怎么做吗?谢谢了 还有就是,这个dll具体要怎么写呢?我也不是很懂。能给我也讲一下啊。谢谢了。 你好。我做的是一个基于socket的客户端和服务器通信的。用到序列化和反序列化。我在客户端序列化之后在服务器端反序列化。按照您说的不行啊。因为在写代码的时候不可以引用另外一个项目的程序集的吧???我这个不是很清楚,如果这样做可以的话希望您能指点我一下。 你服务器端装.net Framework了么? 你的代码 没有问题,只是类所在的dll 没在服务器端因为你序列化的是客户端的类,服务器不认识 估计是某个类型的程序集丢失了吧,我这里有个序列化的代码以及反序列化代码,你看一下有没有用 /// <summary> /// XML序列化对象 /// </summary> /// <param name="Instance"></param> /// <returns></returns> public static string ObjectToXML( Object Instance ) { MemoryStream stream = null; TextWriter writer = null; string ObjectXml = string.Empty; try { stream = new MemoryStream(); // read xml in memory writer = new StreamWriter( stream, Encoding.UTF8 ); Type t = Instance.GetType(); XmlSerializer serializer = new XmlSerializer( t ); XmlSerializerNamespaces xsn = new XmlSerializerNamespaces(); xsn.Add( string.Empty, string.Empty ); serializer.Serialize( writer, Instance, xsn ); int count = ( int )stream.Length; byte[] arr = new byte[count]; stream.Seek( 0, SeekOrigin.Begin ); stream.Read( arr, 0, count ); UTF8Encoding utf = new UTF8Encoding(); ObjectXml = utf.GetString( arr ).Trim(); } catch ( Exception ex ) { string ss = ex.Message; } finally { if ( stream != null && stream.Length > 0 ) { stream.Close(); } if ( writer != null ) { writer.Close(); } } return FormatXml( ObjectXml ); } /// <summary> /// 反序列化XML字符串 /// </summary> /// <param name="xml">xml data of employee</param> /// <returns></returns> public static object XMLToObject( string xml, Type t ) { StringReader stream = null; XmlTextReader reader = null; Object o = null; try { XmlSerializer serializer = new XmlSerializer( t ); stream = new StringReader( xml ); reader = new XmlTextReader( stream ); o = serializer.Deserialize( reader ); } catch{} finally { if ( stream != null ) { stream.Close(); } if ( reader != null ) { reader.Close(); } } return o; } 您好。您说的“类所在的dll 没在服务器端因为你序列化的是客户端的类,服务器不认识”,这个是什么意思?我把客户端的那个User的类原封不动的写成为一个dll,放在服务器端的bin下就可以了吗?谢谢您了。 对 你客户端和服务端先用一个 看看行不行 就是必需dll丢了的缘故 你好。还在吗??我把我的User类的所有的代码写到一个dll项目中。然后点击的生成->重新生成,这样生成了一个dll,然后拷贝到了服务器端的bin文件夹下。这样我启动了服务器,再用客户端序列化,在服务端反序列化的时候还是那个问题。您还能给我说一下吗?是哪里的问题 服务器端要添加那个DLL的引用 你把要序列化的类 也就是 User 类 放在一个单独的项目中 也就是 类库项目中,然后 生成项目。客户端 也引用 该类库省生成的 dll 哦看来是我没添加。这个该怎么添加呢?是using语句吗?该怎么写呢? 恩。这个我明白了。但是写好了怎么添加引用呢?在我的客户端和服务器端怎么写???是using语句吧? 在引用中添加引用DLL文件 在你的项目上右键, 选择添加引用 然后 找到相应的dll 我是这样做的。点击 引用->添加引用->找到刚刚建立的User的那个项目->找到debug目录的那个dll。结果悲剧了。还是不行。还是刚刚的那个错误哭 我是这样做的。点击 引用->添加引用->找到刚刚建立的User的那个项目->找到debug目录的那个dll。结果悲剧了。还是不行。还是刚刚的那个错误哭 我还需要做其他的什么工作吗?比如说那个dll的名字有没有什么特殊的限制?或者是其他的什么 你现在客户端 也是引用的 dll 么 对了。我想起来一个问题。我写了dll之后我的客户端还需要再写那个User的类吗?应该不需要了吧? 恩 我在客户端也引用了那个dll了都弄了一个晚上了 你好。我的问题您还有什么好的办法吗?我写了dll,也在客户端和服务器端都添加了引用。在客户端和服务器端我还需要写这个User类吗?可是如果不写的话VS会提示找不到这个类。用using语句我也不知道具体怎么用。应该是没有写using而引起的吧?您知道怎么写吗? 参照这个,同时注意命名空间在项目中 添加引用 后使用如果有命名空间 使用 using 导入相应命名空间即可 我昨天晚上快一点的时候终于成功了。由于一个帖子同一个人不能连续回帖三次,就没结贴。错误原因如下:错误在于我建立的dll项目的名字是ClassLib,我生成dll之后又把ClassLib.dll的名字改为了User.dll,结果就还是那个错误。改回来就好了。谢谢大家了。这个帖子也是后来人的一堂好课!!! 哈哈哈哈哈,解决了我的问题啊。感谢楼主好帖,感谢csdn提供这个平台,感谢电信,感谢祖国haha SQL语句的查询 C#如何保存对象在自定义文件里 头痛的WinForm的加载和关闭窗体问题(在线给分) 图形报表!!!!! Web服务有点难度的问题:在被调用方法里面取得调用者方法的名称 分不是问题,菜鸟上路,C#中怎么没有普通的Grid的控件啊? 请教c#中显示wav文件参数问题 超简单问题, WM_KEYDOWN在哪里定义的? 用npoi导出复杂格式的excel报表 微信企业号如何通过代码创建菜单(c#) C# 子窗体关闭后进程还被主窗体占用,怎样结束? Winform中调用webservice怎么拿出DictionaryEntry的值并绑定到DataGridView上
小弟是这么写的: public static object Deserialize(byte[] data)
{
IFormatter formatter = new BinaryFormatter();
formatter.Binder = new UBinder();
MemoryStream stream = new MemoryStream(data); //这里的错误:无法找到程序集
object obj = (object)formatter.Deserialize(stream);
return obj;
} 上面是反序列化的代码
public static byte[] Serialize(object obj)
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.MemoryStream stream = new System.IO.MemoryStream();
formatter.Serialize(stream, obj);
byte[] data = stream.GetBuffer();
return data;
}上面是序列化的代码
{
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
System.IO.MemoryStream stream = new System.IO.MemoryStream(data);
data = null;
Object obj = formatter.Deserialize(stream);
return obj; }也是从网上找的代码。
后期动态加载确定AppDomain 中的所有可用程序集中包括要使用的类型
以及反序列化代码,你看一下有没有用 /// <summary>
/// XML序列化对象
/// </summary>
/// <param name="Instance"></param>
/// <returns></returns>
public static string ObjectToXML( Object Instance )
{
MemoryStream stream = null;
TextWriter writer = null;
string ObjectXml = string.Empty;
try
{
stream = new MemoryStream(); // read xml in memory
writer = new StreamWriter( stream, Encoding.UTF8 ); Type t = Instance.GetType();
XmlSerializer serializer = new XmlSerializer( t ); XmlSerializerNamespaces xsn = new XmlSerializerNamespaces();
xsn.Add( string.Empty, string.Empty ); serializer.Serialize( writer, Instance, xsn );
int count = ( int )stream.Length;
byte[] arr = new byte[count];
stream.Seek( 0, SeekOrigin.Begin );
stream.Read( arr, 0, count );
UTF8Encoding utf = new UTF8Encoding();
ObjectXml = utf.GetString( arr ).Trim();
}
catch ( Exception ex )
{
string ss = ex.Message;
}
finally
{
if ( stream != null && stream.Length > 0 )
{
stream.Close();
}
if ( writer != null )
{
writer.Close();
}
} return FormatXml( ObjectXml );
} /// <summary>
/// 反序列化XML字符串
/// </summary>
/// <param name="xml">xml data of employee</param>
/// <returns></returns>
public static object XMLToObject( string xml, Type t )
{
StringReader stream = null;
XmlTextReader reader = null;
Object o = null;
try
{
XmlSerializer serializer = new XmlSerializer( t );
stream = new StringReader( xml );
reader = new XmlTextReader( stream );
o = serializer.Deserialize( reader );
}
catch{}
finally
{
if ( stream != null )
{
stream.Close();
}
if ( reader != null )
{
reader.Close();
}
} return o;
}
你客户端和服务端先用一个 看看行不行 就是必需dll丢了的缘故
参照这个,同时注意命名空间在项目中 添加引用 后使用如果有命名空间 使用 using 导入相应命名空间即可