明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: gentellu

对象反系列化问题

  [复制链接]
发表于 2009-3-26 14:32:00 | 显示全部楼层
本帖最后由 作者 于 2009-3-26 15:28:37 编辑

gentellu发表于2008-9-9 10:26:00但直接用Form1启动程序时系列化及反系列化都正常,只是利用CAD来启动Form1进行反系列化时出现异常,我就是不太明白这方面的原因。

就是写成类库(在CAD内调用的dll),就出现异常。

我也为这个问题困扰很久。

发表于 2009-8-31 20:56:00 | 显示全部楼层
这段时间碰巧用了BinaryFormatter序列化/反序列化,
可以实现,但注意不要在初始化例程里反序列化(奇怪的Bug)
贴上代码:)
Command类:
  1. using System;
  2. using System.Reflection;
  3. using Autodesk.AutoCAD.Runtime;
  4. namespace TlsCad.NetAutoLoad
  5. {
  6.     [Serializable]
  7.     public class Command : IComparable
  8.     {
  9.         public string GlobalName;
  10.         public string LocalizedName;
  11.         public string Description;
  12.         public string ModuleName;
  13.         public string TypeName;
  14.         public string MethodName;
  15.         public Command() { }
  16.         public Command(string globalName)
  17.         {
  18.             GlobalName = globalName;
  19.         }
  20.         #region IComparable 成员
  21.         int IComparable.CompareTo(object obj)
  22.         {
  23.             Command cmd = obj as Command;
  24.             return this.GlobalName.CompareTo(cmd.GlobalName);
  25.         }
  26.         #endregion
  27.     }
  28. }
CommandCollection类
  1. using System;
  2. using System.IO;
  3. using System.Resources;
  4. using System.Reflection;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using System.Runtime.Serialization;
  8. using System.Runtime.Serialization.Formatters.Binary;
  9. using Autodesk.AutoCAD.Runtime;
  10. namespace TlsCad.NetAutoLoad
  11. {
  12.     public enum AssemblyLoad
  13.     {
  14.         LoadOnStartup = 2,
  15.         LoadByCmd = 12,
  16.         LoadDisabled = 20
  17.     }
  18.     [Serializable]
  19.     public class CommandCollection : ISerializable
  20.     {
  21.         private AssemblyLoad _loadctrls;
  22.         private string _description;
  23.         private List<Command> _cmds = new List<Command>();
  24.         //private List<string> _groups = new List<string>();
  25.         public CommandCollection() { }
  26.         public CommandCollection(SerializationInfo info, StreamingContext ctxt)
  27.         {
  28.             _loadctrls = (AssemblyLoad)info.GetValue("Assembly_LoadCtrls", typeof(AssemblyLoad));
  29.             _description = (string)info.GetValue("Assembly_Description", typeof(string));
  30.             //_groups = (List<string>)info.GetValue("Assembly_Groups", typeof(List<string>));
  31.             _cmds = (List<Command>)info.GetValue("Assembly_Commands", typeof(List<Command>));
  32.         }
  33.         #region ISerializable 成员
  34.         void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
  35.         {
  36.             info.AddValue("Assembly_LoadCtrls", _loadctrls);
  37.             info.AddValue("Assembly_Description", _description);
  38.             //info.AddValue("Assembly_Groups", _groups);
  39.             info.AddValue("Assembly_Commands", _cmds);
  40.         }
  41.         #endregion
  42.         public AssemblyLoad LoadCtrls
  43.         {
  44.             get { return _loadctrls; }
  45.             set { _loadctrls = value; }
  46.         }
  47.         public string Description
  48.         {
  49.             get { return _description; }
  50.             set { _description = value; }
  51.         }
  52.         public void CopyFrom(CommandCollection ai)
  53.         {
  54.             _loadctrls = ai._loadctrls;
  55.             _description = ai._description;
  56.             _cmds = ai._cmds;
  57.         }
  58.         public void Add(Command cmd)
  59.         {
  60.             _cmds.Add(cmd);
  61.         }
  62.         public void Remove(Command cmd)
  63.         {
  64.             _cmds.Remove(cmd);
  65.         }
  66.         public void Sort()
  67.         {
  68.             _cmds.Sort();
  69.         }
  70.         public int Count
  71.         {
  72.             get { return _cmds.Count; }
  73.         }
  74.         public void WriteTo(string path)
  75.         {
  76.             using (Stream stream = File.Open(path, FileMode.Create))
  77.             {
  78.                 BinaryFormatter bformatter = new BinaryFormatter();
  79.                 bformatter.Serialize(stream, this);
  80.             }
  81.         }
  82.         public void ReadFrom(string path)
  83.         {
  84.             using (Stream stream = File.Open(path, FileMode.Open))
  85.             {
  86.                 BinaryFormatter bformatter = new BinaryFormatter();
  87.                 CommandCollection cmds = (CommandCollection)bformatter.Deserialize(stream);
  88.                 CopyFrom(cmds);
  89.             }
  90.         }
  91.         public void LoadFromAssembly(string path)
  92.         {
  93.             //_groups.Clear();
  94.             _cmds.Clear();
  95.             Assembly assem = Assembly.LoadFrom(path);
  96.             foreach (System.Reflection.Module m in assem.GetModules(true))
  97.             {
  98.                 Type[] types = m.GetTypes();
  99.                 foreach (Type t in types)
  100.                 {
  101.                     ResourceManager rm =
  102.                         new ResourceManager(t.FullName, assem);
  103.                     rm.IgnoreCase = true;
  104.                     MethodInfo[] methods = t.GetMethods();
  105.                     foreach (MethodInfo mi in methods)
  106.                     {
  107.                         object[] attbs =
  108.                             mi.GetCustomAttributes(
  109.                                 typeof(CommandMethodAttribute),
  110.                                 true
  111.                             );
  112.                         foreach (object attb in attbs)
  113.                         {
  114.                             CommandMethodAttribute cma = attb as CommandMethodAttribute;
  115.                             if (cma != null)
  116.                             {
  117.                                 //if (cma.GroupName != null && !_groups.Contains(cma.GroupName))
  118.                                 //{
  119.                                 //    _groups.Add(cma.GroupName);
  120.                                 //}
  121.                                 
  122.                                 Command cmd = new Command(cma.GlobalName);
  123.                                 cmd.ModuleName = m.Name;
  124.                                 cmd.TypeName = t.FullName;
  125.                                 cmd.MethodName = mi.Name;
  126.                                 cmd.LocalizedName = cmd.GlobalName;
  127.                                 string lnid = cma.LocalizedNameId;
  128.                                 if (lnid != null)
  129.                                 {
  130.                                     try
  131.                                     {
  132.                                         cmd.LocalizedName = rm.GetString(lnid);
  133.                                     }
  134.                                     catch
  135.                                     { }
  136.                                 }
  137.                                 _cmds.Add(cmd);
  138.                             }
  139.                         }
  140.                     }
  141.                 }
  142.             }
  143.         }
  144.         //public void Run(Assem assem, Command cmd)
  145.         //{
  146.         //    Assembly assembly = Assembly.LoadFrom(assem.Location);
  147.         //    Module m = assembly.GetModule(cmd.ModuleName);
  148.         //    Type t = m.GetType(cmd.TypeName);
  149.         //    MethodInfo mi = t.GetMethod(cmd.MethodName);
  150.         //    object obj = assembly.CreateInstance(t.FullName);
  151.         //    mi.Invoke(obj, new object[0]);
  152.         //    obj = null;
  153.         //}
  154.         public IEnumerator GetEnumerator()
  155.         {
  156.             return _cmds.GetEnumerator();
  157.         }
  158.     }
  159. }


发表于 2009-8-31 21:53:00 | 显示全部楼层

如版主所说"但注意不要在初始化例程里反序列化",即使相应的类里面没有AutoCAD的类也不行(如没有Point3d等类也不行)

另外即使不是在初始化的时候,若反序列化的类里面有AutoCAD的类也不行(如Point3d等,在构造函数里面有用到或公用属性)

会出现楼主这样的问题.(还没看楼主的代码)

不过这是我两年前AutoCAD2006的记忆了,现在版主说行应该那就是行了(还没看代码也没测试).

另外有个记忆不管是反射还是反系列化,在处理Point3d这些类时应该用全名,即"Autodesk.AutoCAD.Geometry.Point3d",而不要只写"Point3d"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

不好意思!两年前的事情有点记得不大清楚了!
可能我只涉及了反射方面的问题
反系列化可能试过,但只失败而没成功过,因为我现在找不到成功反序列化的代码

另外在使用发射方面的技术时,若涉及Point3d等类型的数据我是自己做特殊处理

发表于 2009-8-31 22:02:00 | 显示全部楼层
sieben发表于2009-8-31 21:53:00另外即使不是在初始化的时候,若反序列化的类里面有AutoCAD的类也不行(如Point3d等,在构造函数里面有用到或公用属性)

记得有看到2009版本的序列化Cad对象的代码,Kean的

应该是2009版本后才支持吧

发表于 2009-9-2 13:13:00 | 显示全部楼层
代码更改了一遍,发现了一些问题
似乎有自定义类型和系统类型混用的时候反序列化仍然不成功
不过,加入下面的类,在初始化时也可以反序列化了

    public class UBinder : SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            return Type.GetType(typeName);
        }
    }

反序列化时
        public void ReadFrom(string path)
        {
            using (Stream stream = File.Open(path, FileMode.Open))
            {
                BinaryFormatter bformatter = new BinaryFormatter();
                bformatter.Binder = new UBinder();
                Assem cmds = (Assem)bformatter.Deserialize(stream);
                CopyFrom(cmds);
            }
        }
看来不是Bug的问题:)
发表于 2010-9-10 12:26:00 | 显示全部楼层

把.dll拖到 "C:\WINDOWS\assembly\"里面就可以反序列化

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 01:34 , Processed in 0.164335 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表