当前位置:编程学习 > C#/ASP.NET >>

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#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,