序列化代码导致未处理的异常

时间:2014-06-12 19:15:22

标签: c# serialization autocad unhandled-exception autocad-plugin

我正在尝试创建一些代码,可以将类库序列化和反序列化为AutoCAD绘图。这个问题与AutoCAD没什么关系,除了它是我无法通过正常方式调试它的原因。我从this article开始了这个项目并成功运行了他的代码。然而,他的代码的结构方式,需要我让我的所有类继承自他的基础对象。因为这显然是代码味道,我知道我需要创建一个界面。下面是我最终得到的代码。

第一部分是负责序列化为AutoCAD绘图的代码。

第二部分是实现我的自定义序列化接口

的类的示例
public class Commands
{
    public class MyUtil
    {

        const int kMaxChunkSize = 127;

        public ResultBuffer StreamToResBuf(MemoryStream ms, string appName)
        {

            ResultBuffer resBuf = new ResultBuffer(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));

            for (int i = 0; i < ms.Length; i += kMaxChunkSize)
            {

                int length = (int)Math.Min(ms.Length - i, kMaxChunkSize);

                byte[] datachunk = new byte[length];

                ms.Read(datachunk, 0, length);

                resBuf.Add(new TypedValue((int)DxfCode.ExtendedDataBinaryChunk, datachunk));
            }

            return resBuf;
        }

        public MemoryStream ResBufToStream(ResultBuffer resBuf)
        {

            MemoryStream ms = new MemoryStream();

            TypedValue[] values = resBuf.AsArray();

            // Start from 1 to skip application name

            for (int i = 1; i < values.Length; i++)
            {

                byte[] datachunk = (byte[])values[i].Value;

                ms.Write(datachunk, 0, datachunk.Length);

            }

            ms.Position = 0;

            return ms;

        }

        public void NewFromEntity(IClearspanSerializable objectToSave, Entity ent)
        {

            using (ResultBuffer resBuf = ent.GetXDataForApplication("Member"))
            {
                BinaryFormatter bf = new BinaryFormatter();

                bf.Binder = new MyBinder();

                MemoryStream ms = this.ResBufToStream(resBuf);
                objectToSave.SetObjectData(bf.Deserialize(ms));
            }

        }


        public void SaveToEntity(IClearspanSerializable objectToSave, Entity ent)
        {

            // Make sure application name is registered
            // If we were to save the ResultBuffer to an Xrecord.Data,
            // then we would not need to have a registered application name

            Transaction tr = ent.Database.TransactionManager.TopTransaction;

            RegAppTable regTable = (RegAppTable)tr.GetObject(ent.Database.RegAppTableId, OpenMode.ForWrite);

            if (!regTable.Has("Member"))
            {
                RegAppTableRecord app = new RegAppTableRecord();

                app.Name = "Member";

                regTable.Add(app);

                tr.AddNewlyCreatedDBObject(app, true);
            }


            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();

            bf.Serialize(ms, objectToSave);
            ms.Position = 0;

            ent.XData = this.StreamToResBuf(ms, "Member");;


        }
    }

    public sealed class MyBinder : SerializationBinder
    {
        public override Type BindToType(string assemblyName, string typeName)
        {
            return Type.GetType(string.Format("{0}, {1}",

              typeName, assemblyName));
        }
    }


    [CommandMethod("SaveClassToEntityXData", CommandFlags.Modal)]
    public void SaveClassToEntityXData(IClearspanSerializable objectToSerialize)
    {

        Database db = Application.DocumentManager.MdiActiveDocument.Database;
        Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

        PromptEntityResult per = ed.GetEntity("Select entity to save class to:\n");

        if (per.Status != PromptStatus.OK)
            return;

        MyUtil util = new MyUtil();



        // Save it to the document
        using (Transaction tr = db.TransactionManager.StartTransaction())
        {

            Entity ent = (Entity)tr.GetObject(per.ObjectId, OpenMode.ForWrite);

            util.SaveToEntity(objectToSerialize, ent);

            tr.Commit();
        }

        // Write some info about the results

        //ed.WriteMessage("Content of MyClass we serialized:\n {0} \n", mc.ToString());

    }


    [CommandMethod("GetClassFromEntityXData", CommandFlags.Modal)]
    public void GetClassFromEntityXData(IClearspanSerializable objectToRestore)
    {

        Database db = Application.DocumentManager.MdiActiveDocument.Database;
        Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

        MyUtil util = new MyUtil();

        PromptEntityResult per = ed.GetEntity("Select entity to get class from:\n");

        if (per.Status != PromptStatus.OK)
            return;

        // Get back the class
        using (Transaction tr = db.TransactionManager.StartTransaction())
        {
            Entity ent = (Entity)tr.GetObject(per.ObjectId, OpenMode.ForRead);
            util.NewFromEntity(objectToRestore, ent);

            tr.Commit();

        }

    }
} 

这是我试图测试的虚拟类:

[Serializable]
public class MattMember: IClearspanSerializable
{
    public string Name;
    List<int> MattsInts;


    public MattMember(string passedName, List<int> passedInts)
    {
        Name = passedName;
        MattsInts = passedInts;
    }

    [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Name", Name);
        info.AddValue("MattsInts", MattsInts);
    }

    [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
    public void SetObjectData(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
        {
            throw new System.ArgumentNullException("info");
        }
        Name = (string)info.GetValue("Name", typeof(string));

        MattsInts = (List<int>)info.GetValue("MattsInts", typeof(List<int>));
    }


    void IClearspanSerializable.SetObjectData(object objectInDisguise)
    {


        if (objectInDisguise == null)
        {
            throw new System.ArgumentNullException("info");
        }

        MattMember objectToCopy = (MattMember)objectInDisguise;

        Name = objectToCopy.Name;

        MattsInts = objectToCopy.MattsInts;
    }
}

这是界面:

public interface IClearspanSerializable
{
    void GetObjectData(SerializationInfo info, StreamingContext context);
    void SetObjectData(object objectInDisguise);
}

当我尝试在AutoCAD中运行代码时,我得到的就是这个错误。这让我相信我的类初始化中存在一个简单的错误。我的断点没有被击中。

Unhandled Exception

我该如何调试?我在哪里搞砸了我的初始化?

[编辑] - 这是“详细信息”中的内容:

******************************************************************************
Application does not support just-in-time (JIT)
debugging. See the end of this message for details.

************** Exception Text **************
System.ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.
   at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure)
   at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method)
   at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.PerDocumentCommandClass.Invoke(MethodInfo mi, Boolean bLispFunction)
   at Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18444 built by: FX451RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
Acdbmgd
    Assembly Version: 20.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AcdbMgd.DLL
----------------------------------------
adui20
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/adui20.DLL
----------------------------------------
AdUiPalettes
    Assembly Version: 20.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AdUiPalettes.DLL
----------------------------------------
WindowsBase
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/WindowsBase/v4.0_4.0.0.0__31bf3856ad364e35/WindowsBase.dll
----------------------------------------
System
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
PresentationFramework
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework/v4.0_4.0.0.0__31bf3856ad364e35/PresentationFramework.dll
----------------------------------------
PresentationCore
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/PresentationCore/v4.0_4.0.0.0__31bf3856ad364e35/PresentationCore.dll
----------------------------------------
System.Xaml
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xaml/v4.0_4.0.0.0__b77a5c561934e089/System.Xaml.dll
----------------------------------------
System.Configuration
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
AdApplicationFrame
    Assembly Version: 0.0.0.0
    Win32 Version: 5.2.8.100
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AdApplicationFrame.DLL
----------------------------------------
AdWindows
    Assembly Version: 5.2.10.200
    Win32 Version: 5.2.10.200
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AdWindows.DLL
----------------------------------------
PresentationFramework.Classic
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework.classic/v4.0_4.0.0.0__31bf3856ad364e35/PresentationFramework.classic.dll
----------------------------------------
System.Drawing
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
accoremgd
    Assembly Version: 20.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/accoremgd.DLL
----------------------------------------
System.Core
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
Acmgd
    Assembly Version: 20.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/Acmgd.DLL
----------------------------------------
AcWindows
    Assembly Version: 20.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AcWindows.DLL
----------------------------------------
AcWindows.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcWindows.resources.DLL
----------------------------------------
AcCui
    Assembly Version: 20.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AcCui.DLL
----------------------------------------
PresentationFramework-SystemXml
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework-SystemXml/v4.0_4.0.0.0__b77a5c561934e089/PresentationFramework-SystemXml.dll
----------------------------------------
PresentationFramework.Aero
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework.Aero/v4.0_4.0.0.0__31bf3856ad364e35/PresentationFramework.Aero.dll
----------------------------------------
WindowsFormsIntegration
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/WindowsFormsIntegration/v4.0_4.0.0.0__31bf3856ad364e35/WindowsFormsIntegration.dll
----------------------------------------
System.Windows.Forms
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
PresentationUI
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationUI/v4.0_4.0.0.0__31bf3856ad364e35/PresentationUI.dll
----------------------------------------
System.Xml.Linq
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml.Linq/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll
----------------------------------------
PresentationFramework-SystemXmlLinq
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework-SystemXmlLinq/v4.0_4.0.0.0__b77a5c561934e089/PresentationFramework-SystemXmlLinq.dll
----------------------------------------
FeaturedAppsPlugin
    Assembly Version: 20.0.0.0
    Win32 Version: 20.0.46.0.0
    CodeBase: file:///C:/ProgramData/Autodesk/ApplicationPlugins/Autodesk%20FeaturedApps.bundle/Contents/Windows/2015/Win32/FeaturedAppsPlugin.dll
----------------------------------------
UIAutomationTypes
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/UIAutomationTypes/v4.0_4.0.0.0__31bf3856ad364e35/UIAutomationTypes.dll
----------------------------------------
PresentationFramework-SystemCore
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/PresentationFramework-SystemCore/v4.0_4.0.0.0__b77a5c561934e089/PresentationFramework-SystemCore.dll
----------------------------------------
Anonymously Hosted DynamicMethods Assembly
    Assembly Version: 0.0.0.0
    Win32 Version: 4.0.30319.18444 built by: FX451RTMGDR
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/mscorlib/v4.0_4.0.0.0__b77a5c561934e089/mscorlib.dll
----------------------------------------
AcLayer
    Assembly Version: 20.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AcLayer.DLL
----------------------------------------
AcLayer.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcLayer.resources.DLL
----------------------------------------
AcAeNet.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcAeNet.resources.DLL
----------------------------------------
AcCloudRender.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcCloudRender.resources.DLL
----------------------------------------
AcCustomize.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcCustomize.resources.DLL
----------------------------------------
AcDxWizard.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcDxWizard.resources.DLL
----------------------------------------
AcExportLayoutUI.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcExportLayoutUI.resources.DLL
----------------------------------------
AcInterfere.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcInterfere.resources.DLL
----------------------------------------
AcLayerTools.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcLayerTools.resources.DLL
----------------------------------------
AcMrUi.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcMrUi.resources.DLL
----------------------------------------
AcMultiLineUi.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcMultiLineUi.resources.DLL
----------------------------------------
AcRecoverAll.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcRecoverAll.resources.DLL
----------------------------------------
AcScaleList.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcScaleList.resources.DLL
----------------------------------------
AcUnderlay.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcUnderlay.resources.DLL
----------------------------------------
AcViewTransitionsUi.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcViewTransitionsUi.resources.DLL
----------------------------------------
AdskConnectionPointMgd.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AdskConnectionPointMgd.resources.DLL
----------------------------------------
AcCalcUi.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcCalcUi.resources.DLL
----------------------------------------
AcLivePreviewContext
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AcWindows.dll
----------------------------------------
AcDialogToolTips
    Assembly Version: 20.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/AcDialogToolTips.DLL
----------------------------------------
AcDialogToolTips.resources
    Assembly Version: 0.0.0.0
    Win32 Version: 20.0.51.0.0
    CodeBase: file:///C:/Program%20Files/Autodesk/AutoCAD%202015/en-US/AcDialogToolTips.resources.DLL
----------------------------------------
Write To Block
    Assembly Version: 1.0.5276.26438
    Win32 Version: 1.0.0.0
    CodeBase: file:///C:/Users/Administrator/Documents/Clearspan/AutoCAD%20Projects/Write%20To%20Block/Write%20To%20Block/bin/Debug/Write%20To%20Block.dll
----------------------------------------

************** JIT Debugging **************
Application does not support Windows Forms just-in-time (JIT)
debugging. Contact the application author for more
information.

4 个答案:

答案 0 :(得分:1)

   at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method, Boolean throwOnBindFailure)
   at System.Delegate.CreateDelegate(Type type, Object firstArgument, MethodInfo method)
   at Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)

正确解释堆栈跟踪很重要。您发布的代码都没有涉及,它从未开始。当AutoCAD尝试调用命令处理程序时失败:

[CommandMethod("GetClassFromEntityXData", CommandFlags.Modal)]
public void GetClassFromEntityXData(IClearspanSerializable objectToRestore)
// etc..

AutoCAD不会为您提供 objectToRestore 参数,它不了解您的界面bean。这是异常的含义,它不能将委托绑定到具有mystery参数的方法。请注意您从哪里开始的示例代码使用不带参数的方法。以及它如何使用Editor.GetEntity()来允许用户选择绘图实体。我假设你需要一个类似的方案,我对AutoCAD脚本的了解不够。

答案 1 :(得分:1)

  

System.ArgumentException:无法绑定到目标方法,因为它   签名或安全透明度与   代表类型。

我的理解是你的界面&#34; GetObjectData&#34;方法在BinnaryFormatter厨房的某处与ISerializable相冲突
只需重构MyUtil中的所有转换函数(StreamToResBuf,ResBufToStream ...),您就应该能够序列化/反序列化标有[Serializable]属性的任何类
您的虚拟类应该如下所示(集合和基元类型是自动序列化的,仅在需要时实现ISerializable):

[Serializable]
public class MattMember
{
    public string Name;
    List<int> MattsInts;
}

NewFromEntity方法(避免在此处进行任何不必要的演员):

    public object NewFromEntity(Entity ent)
        {    
            using (ResultBuffer resBuf = ent.GetXDataForApplication("Member"))
            {
                BinaryFormatter bf = new BinaryFormatter();

                bf.Binder = new MyBinder();

                MemoryStream ms = this.ResBufToStream(resBuf);
                return bf.Deserialize(ms);
            }    
        }

最后你的命令:

[CommandMethod("GetClassFromEntityXData", CommandFlags.Modal)]
//Updated return type here but don't know if it is correct with AutoCAD
public object GetClassFromEntityXData()
{
    Database db = Application.DocumentManager.MdiActiveDocument.Database;
    Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
    object objectToRestore;

    MyUtil util = new MyUtil();

    PromptEntityResult per = ed.GetEntity("Select entity to get class from:\n");

    if (per.Status != PromptStatus.OK)
        return;

    // Get back the class
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        Entity ent = (Entity)tr.GetObject(per.ObjectId, OpenMode.ForRead);
        //Cast to your IClearspan interface here, or use Reflection
        // to determine deserialized object's Type
        objectToRestore = util.NewFromEntity(ent);

        tr.Commit();
    }

    return objectToRestore;
}

答案 2 :(得分:0)

在黑暗中拍摄:您需要一个默认构造函数,因为其他人构建了您的对象:

public MattMember()
{

}

或像这样的特殊deseralization-constructor:

    protected MattMember(SerializationInfo info, StreamingContext context)
    {
// Set object data    
    } 

您的界面可能还需要从ISerializable继承

答案 3 :(得分:0)

[CommandMethod("SaveClassToEntityXData", CommandFlags.Modal)]
public void SaveClassToEntityXData(IClearspanSerializable objectToSerialize)
  

实现命令的函数不能接受参数,但在命令实现中,您可以使用命令行输入函数接受参数,如GetString(),GetInteger()等,可以在Editor类下找到。

来自http://adndevblog.typepad.com/autocad/2012/07/create-command-with-parameters.html