序列化代码导致未处理的异常 [英] Serialization Code Causes Unhandled Exception

查看:123
本文介绍了序列化代码导致未处理的异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一些代码,这些代码可以将类库序列化和反序列化为AutoCAD图形。这个问题与AutoCAD无关,只是因为我无法通过常规方法对其进行调试。我从本文,并成功运行了他的代码。无论他的代码结构如何,这都需要我让我所有的类都从他的基础对象继承。因为这显然是代码的味道,所以我知道我需要创建一个接口。下面是我最终得到的代码。

I am attempting to create a some code that can serialize and deserialize a library of Classes into an AutoCAD drawing. This question has little to do with AutoCAD other than it being the reason why I cannot debug it by normal means. I started this project from this article and successfully got his code to run. However the way his code is structured, It would require me to have all of my classes inherit from his baseobject. As this clearly is a code smell, I knew I needed to create an interface instead. Below is the code that I ended up with.

第一部分是负责将序列化到AutoCAD图形中的代码。

This first section is the code responsible for doing the serialization into an AutoCAD drawing.

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

The second section is an example of a class that implements my custom serialization interface

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();

        }

    }
} 

这是我尝试测试的虚拟课程:

Here is a dummy class I am attempting to test with:

[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中运行代码时,我得到的只是这个错误。这使我相信我的类初始化中存在一个简单的错误。

When I attempt to run the code inside AutoCAD, All I get is this error. Which leads me to believe there is a simple bug in my initialization of my classes. Non of my breakpoints get hit.

我应该如何调试呢?

-这是详细信息中的内容:

-Here is what is in the "Details":

******************************************************************************
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.


推荐答案


System.ArgumentException:无法绑定到目标方法,因为其
签名或安全透明性与
委托类型的不兼容。

System.ArgumentException: Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type.

我的理解是,您接口的 GetObjectData方法与BinnaryFormatter厨房中某个地方的ISerializable方法冲突。



只需重构所有转换函数(StreamToResBuf, ResBufToStream ...),然后应该可以序列化/反序列化标记有[Serializable]属性的任何类

您的虚拟类应如下所示(集合和原始类型是自动序列化的,仅在需要时实现ISerializable):

My understanding is that your interface's "GetObjectData" method conflicts with the ISerializable one, somewhere in the BinnaryFormatter kitchen.

Just refactor all the conversion function (StreamToResBuf, ResBufToStream...) in your MyUtil and you should be able to serialize/deserialize any class marked with the [Serializable] attribute.
Your dummy class should look like this (collection and primitive types are auto-serialized, implement ISerializable only when needed) :

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

NewFromEntity方法(避免在此处进行任何不必要的强制转换):

The NewFromEntity method (avoid any unnecessary cast here) :

    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;
}

这篇关于序列化代码导致未处理的异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆