com序列化
MemoryStream stream = new MemoryStream();Class1 w = new Class1();
BinaryFormatter formatter = new BinaryFormatter(null,
new StreamingContext(StreamingContextStates.Clone));
formatter.Serialize(stream, w);
//stream.Position = 0;
stream.Flush();
stream.Seek(0, SeekOrigin.Begin);
obj = (Class1)formatter.Deserialize(stream);////////////// 错误就出现在这里
stream.Close();
问题的详细情况:用c#写的dll,封装为com,反序列化就出错,当然,在winform程序中是没有任务问题的,
不知原因何在? --------------------编程问答-------------------- O回复帖,随不知道答案,可以帮你顶一下 --------------------编程问答-------------------- 不清楚。帮你顶。顺便也关注学习下!!! --------------------编程问答-------------------- 出的什么错误? --------------------编程问答-------------------- 第一次看 学习 --------------------编程问答-------------------- to:jiangsheng
呵呵,湖北的专家,我也是湖北的哟,拉哈关系
我在微软搜索到了同样的问题,错误就是 当你把一个dll封装为com时,在网页中调用,就会找不到assembly,
当你在一个assembly序列化,不能在另外一个assembly中反序列化,我在下面的链接中找到了解决方案,但还是有问题,
当我重新编译后,又不能打开前面编译的assembly序列化的文件,报找不到assembly的错误,
我的理解,当网页调用com时,它默认的路径不是你的虚拟目录路径,好像是GAC,当然我把dll全部拷贝到GAC也出问题,
现在觉得序列化和assembly的版本有关,后面编译的不能打开前面编译的,当然,在客户端时,没有这问题.
ResolveEventHandler resolveEvH = new ResolveEventHandler(
delegate(object sender, ResolveEventArgs args)
{
System.Reflection.Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (System.Reflection.Assembly item in ayAssemblies)
{
if (item.FullName == args.Name)
return item;
}
return null;
});
AppDomain.CurrentDomain.AssemblyResolve += resolveEvH;
//这中间可以序列化与反序列化
MemoryStream stream = new MemoryStream();
Class1 w = new Class1();
BinaryFormatter formatter = new BinaryFormatter(null,
new StreamingContext(StreamingContextStates.Clone));
formatter.Serialize(stream, w);
//stream.Position = 0;
stream.Flush();
stream.Seek(0, SeekOrigin.Begin);
obj = (Class1)formatter.Deserialize(stream);////////////// 错误就出现在这里
stream.Close();
AppDomain.CurrentDomain.AssemblyResolve -= resolveEvH;
http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/e5f0c371-b900-41d8-9a5b-1052739f2521 --------------------编程问答-------------------- 请问楼主那COM里的类可支持序列化不?如果不支持可能就是问题所在 --------------------编程问答-------------------- 楼上的,
类当然支持序列化啊. --------------------编程问答-------------------- up --------------------编程问答-------------------- mark --------------------编程问答-------------------- 序列化到XML看看 --------------------编程问答-------------------- 程序里面有太多的非空构造函数
还有Font等无法序列化为xml,所以没有序列化为xml
我现在找到了一直忽略强名称的方法,代码如下
基本可以满足要求
但是,这样一来,强名称好像就不起作用了,当然,封装成com时,必须要求强名称
public class SimpleDeserializationBinder : SerializationBinder
{
private Regex _assemRegex = new Regex("(?<assembly>^.*?),.*");
private Regex _typeRegex = new
Regex("(?<type>.*?),(?<assembly>.*?),.*(?<end>]])");
public override Type BindToType(string assemblyName, string typeName)
{
// remove strong name from assembly
Match match = _assemRegex.Match(assemblyName);
if (match.Success)
{
assemblyName = match.Groups["assembly"].Value;
}
// remove strong name from any generic collections
match = _typeRegex.Match(typeName);
if (match.Success)
{
typeName = string.Format("{0},{1}{2}",
match.Groups["type"].Value,
match.Groups["assembly"].Value,
match.Groups["end"].Value);
}
Type typeToDeserialize = null;
// replace assembly name with the 易做图 assembly name
// - strip the strong name off of the name
string type = string.Format("{0}, {1}", typeName,
assemblyName);
// The following line of code returns the type.
typeToDeserialize = Type.GetType(type);
return typeToDeserialize;
}
} --------------------编程问答-------------------- up
补充:.NET技术 , C#