在Autocad .Net WCF插件中保留ObjectId引用

时间:2015-09-08 08:56:58

标签: c# wcf serialization autocad autocad-plugin

有一个.Net Autocad插件,其中使用WCF服务来调用方法 在Autocad外部的另一个进程。 Autocad实体包装在自定义类中并通过WCF传递。一旦调用返回,插件就需要将结果写回Autocad数据库。

问题在于:需要ObjectId来获取对象并将结果写回来; WCF序列化数据,ObjectId不可序列化。所以我无法访问该对象。

是否有针对此的解决方法/解决方案?

3 个答案:

答案 0 :(得分:3)

您可以使用ObjectId.OldIdPtr属性IntPtr(可序列化)。要恢复ObjectId,请执行以下操作:

var id = new ObjectId(oldIdPtr);

这比使用句柄(需要查找)更直接

答案 1 :(得分:2)

您必须序列化List[String]的值句柄,因为它不可序列化:

ToTraversable

然后,当您反序列化import shapeless._, ops.hlist._ def pairToStrings[L <: HList, M <: HList]( p: Pair )(implicit gen: Generic.Aux[Pair, L], mapper: Mapper.Aux[strings.type, L, M], trav: ToTraversable.Aux[M,List,String] ): List[String] = gen.to(p).map(strings).toList 时,您可以通过调用方法scala> pairToStrings(Pair("abc", 12)) res2: List[String] = List(abc, 12)

来获取ObjectId

答案 2 :(得分:0)

对于您的每个实体,您可以直接处理而无需mediator(objectId)。 使用Entity.Handle属性。 进一步来自autocad指南

Database对象中包含的每个对象都分配了几个唯一ID。您可以访问对象的独特方式是: 实体句柄 的ObjectId 实例指针 最常见的方法是通过Object Id访问对象。如果您的项目同时使用COM互操作和托管的.NET API,则对象ID很有效。如果您创建自定义AutoLISP函数,则可能需要使用实体句柄。 句柄在AutoCAD会话之间是持久的,因此如果您需要将绘图信息导出到以后可能需要用于更新绘图的外部文件,它们是访问对象的最佳方式。仅当数据库加载到内存中时,才存在数据库中对象的ObjectId。数据库关闭后,分配给对象的Object Ids不再存在,下次打开数据库时可能会有所不同。