marshalling 相关问题

编组是将对象的存储器表示转换为适合于存储或传输的数据格式的过程

在 c#/.net 中固定内存时的性能成本/注意事项是什么 [已关闭]

我有一个c# opengl 桌面应用程序。 我们有各种缓冲区,每帧都会更新,因此需要每帧传输到 GPU。 目前,我们为每个缓冲区保留一个引脚......

回答 1 投票 0

结构重叠或错误对齐

我的结构布局有问题。我想要一个包含其他结构数组的结构。编译器不会抱怨我的实现: [StructLayout(LayoutKind.Explicit, Pack = 1, Si...

回答 1 投票 0

重叠或错误对齐的结构 C#

我的结构布局有问题。我想要一个包含其他结构数组的结构。编译器不会抱怨我的实现: [StructLayout(LayoutKind.Explicit, Pack = 1, Si...

回答 1 投票 0

关于“Marshal.GetActiveObject(System.String)”方法的实现问题

我尝试连接到正在运行的 Solid Edge 实例,但收到以下错误: System.MissingMethodException:“找不到方法:”System.Object System.Runtime.InteropServices.Marshal。

回答 1 投票 0

Delphi 11 中 TJsonMarshal 的自定义转换器

更新:我让转换器运行,显然即使 embarcadero 将 const FIELD_ANY 定义为 '*',如果不这样做,它不会运行 指定确切的字段名称,在我的例子中是 FListHelper。这提高了...

回答 1 投票 0

如何避免解析ISuperObject类型字段中的json对象

很久以前,我们决定使用 XSuperObject 库将对象编组为 json,以便在系统的两个部分之间进行转换。其中一个字段在服务器端表示为 ISuperObject,并表示为 var...

回答 1 投票 0

发生 JAXBException:类 com.jaxb.model.copy.copy.Snapshot 及其任何超类对此上下文都是已知的..

有人可以帮我解决这个问题吗? 发生 JAXBException :此上下文已知类 com.jaxb.model.copy.copy.Snapshot 或其任何超类。 接口 JaxbWebResource 包装...

回答 2 投票 0

如何重用第三方包中的结构,同时更改单个字段的编组行为?

假设我想将一个结构编组到 YAML 中,并且该结构已经定义了其所有 YAML 标签,但有一个标签我想更改。我怎样才能改变这个单曲的行为...

回答 1 投票 0

如何重用外部包中的结构,但覆盖单个字段的编组行为?

假设我想将一个结构编组到 YAML 中,并且该结构已经定义了其所有 YAML 标签,但有一个标签我想更改。我怎样才能改变这个单曲的行为...

回答 1 投票 0

C# 中包含指向数组的指针的 Marshal C++ 联合

我在 C# 中创建与 C++ 中的结构布局相对应的结构布局时遇到问题,以便对其进行封送。以下是应在 C++ 中封送的类型: 枚举E1 { }; 枚举E2 { }; 结构 Fo...

回答 1 投票 0

嵌套结构的链式 Marshal OffsetOf

有与此答案中评论相同的困惑。 引用 CleanCoder 的内容: Marshal.OffsetIf 可以用于结构体中的字段/属性吗?这需要如何命名?让我们说:Struct1。

回答 1 投票 0

如何将命名空间定义从根元素移动到 JAXB 中的特定子元素?

我正在开发一个 Java 应用程序,它使用 JAXB 将 Java 对象编组到 XML 中。目前,生成的 XML 如下所示: 我正在开发一个 Java 应用程序,它使用 JAXB 将 Java 对象编组到 XML 中。目前,生成的 XML 如下所示: <A xmlns="A" xmlns:ns2="B" xmlns:ns3="C"> <t1>content</t1> <t2> <ns2:t3> <ns2:t4>content2</ns2:t4> </ns2:t3> </t2> </A> 命名空间定义放置在根标签“A”中。而且,某些命名空间(例如“C”)甚至没有被使用。我想将命名空间定义放置在内部子级中代替前缀。例如,我想获取以下xml: <A xmlns="A"> <t1>content</t1> <t2 xmlns:ns2="B"> <t3> <t4>content2</t4> </t3> </t2> </A> 这两个 xml 都是有效的,但我需要生成第二个输出才能通过第三方应用程序的验证。 我怎样才能实现这个目标? 谢谢你。 请注意,xmlns:name="..."仅将命名空间与前缀相关联。具有此前缀的任何元素都将属于关联的命名空间。没有前缀的元素属于默认命名空间。 因此... 在您的第一个示例中,从未使用命名空间 C。 在第二个示例中,使用的唯一命名空间是默认命名空间,因为两个元素都没有前缀。 除此之外,将命名空间声明放在哪里并不重要,只要在需要时声明它们即可。 <A xmlns="A" xmlns:ns2="B"> <t1>content</t1> <t2> <ns2:t3> <ns2:t4>content2</ns2:t4> </ns2:t3> </t2> </A> 相当于 <A xmlns="A"> <t1>content</t1> <t2> <ns2:t3 xmlns:ns2="B"> <ns2:t4>content2</ns2:t4> </ns2:t3> </t2> </A> 使用 JAXB 时,您必须使用 XmlElement 注释定义命名空间: @XmlElement(name = "t3", namespace = "B") protected T3 t3; 对应属于此命名空间的任何其他元素重复此操作。

回答 1 投票 0

编组指向结构数组的指针

我正在尝试调用为 c/cpp 编写的力传感器的驱动程序 dll。工作的 Cpp 代码如下所示: 我与 dll 一起提供的头文件,结构体定义为...

回答 3 投票 0

将结构数组从 C# 传递到 C++

我正在尝试创建 C# 代码,它调用具有 C 接口的 DLL 中的函数。我是 C 和 C++ 专家,但我对 C# 的了解非常有限。我已经设法将 DLL 加载到 C#

回答 0 投票 0

Go 中的 YAML 自定义标签

我在 Go 中有这些嵌套结构,它们的属性带有自定义标签, 类型 DummyParams 结构 { Param1 字符串 `yaml:"param1"` Param2 字符串 `yaml:"param2"` } 输入假人 ...

回答 1 投票 0

哪个Go库方便存放内部数据,方便下次调试?

我想重现发生在某个复杂过程深处的单个函数调用。 可以重现整个过程,但不方便。相反,我可以存储所有参数 ...

回答 0 投票 0

在 dotnet 中具有后期绑定的 Typesafe COM 组件

我在 x32 中有一些库需要从 x64 进程调用。谷歌搜索,我发现最好的方法是使用 COM 组件。我在 C# 中创建了 3 个项目: X64 的 WinForms 项目

回答 0 投票 0

Protobuf 比 Golang 中的 json 序列化慢,尽管进行了公开测试

根据我在 Google 中找到的每项测试,每一次对 protobuf 序列化与 json 序列化进行基准测试的尝试都会导致第一个更快。但在我的情况下是完全相反的。 例如...

回答 1 投票 0

使用 Marshal.ReadByte() 时出现 AccessViolationException

我正在尝试将 Halcon 对象转换为位图,并在网上找到了这段代码: https://github.com/Joncash/HanboAOMClassLibrary/blob/master/Hanbo.Helper/ImageConventer.cs /// ... 我正在尝试将 Halcon 对象转换为位图,并在网上找到了这段代码: https://github.com/Joncash/HanboAOMClassLibrary/blob/master/Hanbo.Helper/ImageConventer.cs /// <summary> /// Halcon Image .NET Bitmap /// </summary> /// <param name="halconImage"></param> /// <returns></returns> public static Bitmap ConvertHalconImageToBitmap(HObject halconImage, bool isColor) { if (halconImage == null) { throw new ArgumentNullException("halconImage"); } HTuple pointerRed = null; HTuple pointerGreen = null; HTuple pointerBlue = null; HTuple type; HTuple width; HTuple height; // Halcon var pixelFormat = (isColor) ? PixelFormat.Format32bppRgb : PixelFormat.Format8bppIndexed; if (isColor) HOperatorSet.GetImagePointer3(halconImage, out pointerRed, out pointerGreen, out pointerBlue, out type, out width, out height); else HOperatorSet.GetImagePointer1(halconImage, out pointerBlue, out type, out width, out height); Bitmap bitmap = new Bitmap((Int32)width, (Int32)height, pixelFormat); BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat); int bytes = Math.Abs(bmpData.Stride) * bitmap.Height; byte[] rgbValues = new byte[bytes]; IntPtr ptrB = new IntPtr(pointerBlue); IntPtr ptrG = IntPtr.Zero; IntPtr ptrR = IntPtr.Zero; if (pointerGreen != null) ptrG = new IntPtr(pointerGreen); if (pointerRed != null) ptrR = new IntPtr(pointerRed); int channels = (isColor) ? 3 : 1; // Stride int strideTotal = Math.Abs(bmpData.Stride); int unmapByes = strideTotal - ((int)width * channels); for (int i = 0, offset = 0; i < bytes; i += channels, offset++) { if ((offset + 1) % width == 0) { i += unmapByes; } rgbValues[i] = Marshal.ReadByte(ptrB, offset); //where I get the accesviolation if (isColor) { rgbValues[i + 1] = Marshal.ReadByte(ptrG, offset); rgbValues[i + 2] = Marshal.ReadByte(ptrR, offset); } } Marshal.Copy(rgbValues, 0, bmpData.Scan0, bytes); bitmap.UnlockBits(bmpData); return bitmap; } 但是当我尝试运行它时,它在读取或写入受保护的内存时得到一个 AccesViolationExeption。 有人知道为什么吗? 我已经调试并确保 IntPtr 不为空

回答 0 投票 0

JAXB Unmarshall 正在删除数字签名中的回车

我正在使用以下依赖项进行 XML 签名: jakarta.activation jakarta.activation-api 我正在使用以下依赖项进行 XML 签名: <dependency> <groupId>jakarta.activation</groupId> <artifactId>jakarta.activation-api</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>4.0.0</version> <scope>runtime</scope> </dependency> 我能够使用信封成功生成签名: <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/><Reference URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><DigestValue>xndyhbkzbLreG3cxXqa5Q5RdKEavhrc2Fvd0Wsc+Oug=</DigestValue></Reference></SignedInfo><SignatureValue>No+gNx3Hwd3WfH0v6OZ8uptWVyneZT55CfUrxMnW33a87egeiImwsyepZZXTbya0ifzX1iOtyyaf&#13; OwEDxTFhf/FCPH6Nj9KCFNabZddwN38tCOkkAkYdkKdW14AM80HU/9yPIAMWytibbyd3AKVuRQgd&#13; +qkf1/V8J1Ki1LNO4tbPzxqpNMpRmpH/469lgMHEz9Xy1DnJ154E+H2OWNufooGwwpV/pMbM8RzY&#13; 当我尝试这样验证时,它起作用了: signature.sign(dsc); System.out.println("doc: " + getStringFromDocument(doc) + " validate: " + validate(doc)); 但是,当我尝试解组签名以便将其分配给 DTO 时,它失败了: JAXBElement<?> root = XmlUtils.getUnMarshaller(xml.getClass().getName()).unmarshal(getStreamSource(doc), xml.getClass()); xml.setSignature(((SignXml<?>) root.getValue()).getSignature()); 在比较文档中生成的签名和解组的签名时,我发现字符 被删除: 医生 <SignatureValue>No+gNx3Hwd3WfH0v6OZ8uptWVyneZT55CfUrxMnW33a87egeiImwsyepZZXTbya0ifzX1iOtyyaf&#13; OwEDxTFhf/FCPH6Nj9KCFNabZddwN38tCOkkAkYdkKdW14AM80HU/9yPIAMWytibbyd3AKVuRQgd&#13; +qkf1/V8J1Ki1LNO4tbPzxqpNMpRmpH/469lgMHEz9Xy1DnJ154E+H2OWNufooGwwpV/pMbM8RzY&#13; +yVSjKguJr9UWKWswQkD0XUasVXBZckjlYxZL24ZwD1rwU7wP2itOli3VH9ReC3CA33YOUMT0ktP&#13; 解组 <ns2:SignatureValue>No+gNx3Hwd3WfH0v6OZ8uptWVyneZT55CfUrxMnW33a87egeiImwsyepZZXTbya0ifzX1iOtyyafOwEDxTFhf/FCPH6Nj9KCFNabZddwN38tCOkkAkYdkKdW14AM80HU/9yPIAMWyt 正如我们所看到的,签名是相同的,唯一的区别是字符 被删除了。 我试着查看 EscapeCharacter 解决方案,但它似乎只在旧的 JAXB 实现中可用。有什么想法吗? 性格 是回车 (CR) 字符的转义序列。似乎这个字符在解组过程中被删除,这导致签名不同。 一个解决方案可能是显式添加 字符返回到未编组的签名值。一种方法是创建一个自定义 XMLAdapter,它将添加 解组期间将字符添加到签名值。 这是一个如何创建自定义 XMLAdapter 的示例: public class SignatureValueAdapter extends XmlAdapter<String, String> { @Override public String unmarshal(String value) throws Exception { return value + "&#13;"; } @Override public String marshal(String value) throws Exception { return value; } } 这个适配器只是添加了 解组期间签名值末尾的字符。要使用此适配器,您需要使用 @XmlJavaTypeAdapter(SignatureValueAdapter.class) 注释 DTO 中的 SignatureValue 字段。 举个例子: @XmlRootElement(name = "SignXml") @XmlAccessorType(XmlAccessType.FIELD) public class SignXml<T> { @XmlElement(name = "Signature") @XmlJavaTypeAdapter(SignatureValueAdapter.class) private String signature; // getters and setters } 通过将 @XmlJavaTypeAdapter(SignatureValueAdapter.class) 注释添加到签名字段,自定义 XMLAdapter 将在解组期间使用以添加 字符返回签名值。 一个可能的解决方案是将 CR 字符的所有实例替换为数据中不存在的不同字符或字符串。例如,您可以替换“的所有实例 “ 和 ” " 在编组之前,然后替换 " 的所有实例 “ 和 ” " 解组后。这将确保作为数据一部分的 CR 字符被正确保留。 或者,您可以使用不依赖换行符的不同编码格式,例如二进制编码或 JSON。这些格式旨在处理复杂的数据结构,并且不太可能受到换行问题的影响。

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.