标签: marshalling

我如何GetCustomAttributes?

我已经使用2.0框架尝试了以下代码,我得到了一个属性,但是当我在紧凑框架上尝试这个时,它总是返回一个空数组.MSDN文档说它支持,我做错了吗?

  Test x = new Test();
  FieldInfo field_info = x.GetType().GetField("ArrayShorts");
  object[] custom_attributes = field_info.GetCustomAttributes(typeof(MarshalAsAttribute), false);

  [StructLayout(LayoutKind.Sequential)]
  public struct Test
  {
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
     public ushort[] ArrayShorts;
  }
Run Code Online (Sandbox Code Playgroud)

c# attributes compact-framework marshalling getcustomattributes

18
推荐指数
1
解决办法
3万
查看次数

Marshal.PtrToStructure(又返回)和字节顺序交换的通用解决方案

我有一个系统,远程代理发送序列化结构(来自嵌入式C系统)供我通过IP/UDP读取和存储.在某些情况下,我需要发回相同的结构类型.我以为我使用Marshal.PtrToStructure(接收)和Marshal.StructureToPtr(发送)进行了很好的设置.但是,一个小问题是网络大端整数需要转换为我的x86小端格式才能在本地使用.当我再次发送它们时,大端是可行的方式.

以下是有问题的功能:

    private static T BytesToStruct<T>(ref byte[] rawData) where T: struct
    {
        T result = default(T);
        GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
        try
        {
            IntPtr rawDataPtr = handle.AddrOfPinnedObject();
            result = (T)Marshal.PtrToStructure(rawDataPtr, typeof(T));
        }
        finally
        {
            handle.Free();
        }
        return result;
    }

    private static byte[] StructToBytes<T>(T data) where T: struct
    {
        byte[] rawData = new byte[Marshal.SizeOf(data)];
        GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
        try
        {
            IntPtr rawDataPtr = handle.AddrOfPinnedObject();
            Marshal.StructureToPtr(data, rawDataPtr, false);
        }
        finally
        {
            handle.Free();
        }
        return rawData;
    }
Run Code Online (Sandbox Code Playgroud)

还有一个可以像这样使用的快速示例结构:

byte[] data = this.sock.Receive(ref …
Run Code Online (Sandbox Code Playgroud)

.net c# sockets marshalling endianness

18
推荐指数
1
解决办法
2万
查看次数

使用Marshaller将Java对象转换为Json

使用Marshaller将java对象转换为XML非常容易.但我需要单独使用marshaller将java对象转换为JSON.我知道使用gson或Xstream就好了.但我需要使用Marshaller.如何实现它?

提前致谢.

java json jaxb marshalling java-ee

18
推荐指数
1
解决办法
5万
查看次数

正确的方法来组织SIZE_T*?

我有以下C++函数定义,我试图通过托管代码通过PInvoke调用:

bool FooBar(SIZE_T* arg1);
Run Code Online (Sandbox Code Playgroud)

我的管理声明如下:

[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref uint arg1);
Run Code Online (Sandbox Code Playgroud)

有些人可能会注意到我最终做的同样的错误.这不是64位便携式.SIZE_T的大小可变(32-64位),指针也是如此.在托管大小上,指针正确转换为64位,但uint没有,并且您最终可以在arg1的高位中使用垃圾.这是一个特别持久的错误,因为垃圾通常只是零:(

我已经开始工作的唯一解决方案是以下管理声明:

[DllImport("mydll", SetLastError=true, CharSet=CharSet.Unicode)]
private static extern bool FooBar(ref IntPtr arg1);
Run Code Online (Sandbox Code Playgroud)

这当然有效,因为IntPtr可以正确地改变它的大小.在我的代码中,我只是将IntPtr视为一个整数,它可以工作,虽然它看起来像一个丑陋的黑客.在我看来应该有一些方法来正确指定,也许使用UnmanagedType.SysUInt,但我无法提出任何其他工作解决方案.

c# c++ pinvoke marshalling intptr

17
推荐指数
2
解决办法
9754
查看次数

通过COM包装器从托管代码调用COM可见托管组件

我有一个第三方组件,让我们说FIPreviewHandler来处理预览,它实现了IPreviewHandler.FIPreviewHandler实现为托管组件,并通过互操作使用IPreviewHandler接口和相关接口.FIPreviewHandler使用regasm.exe作为COM注册.

我有一个客户端应用程序也管理.我想在我的应用程序中创建一个FIPreviewHandler实例作为COM组件.

我有一个interop程序集,定义IPreviewHandler和相关的接口.

当我使用Activator.CreateInstance()创建一个FIPreviewHandler实例时,GetTypeByCLSID()返回的类型使用FIPreviewHandler的正确CLSID,它返回一个托管实例,因为它有实际的程序集可用,并跳过COM .当我尝试QI /将此实例转换为任何接口,例如IPreviewHandler时,它返回null,因为它作为托管对象加载,尽管FIPreviewHandler实现的IPreviewHandler接口与我在interop中的接口相同,但它在一个不同的命名空间/程序集中,因此为null.如果要返回一个COM实例/ RCW(System .__ ComObject),它将不会占用命名空间,并且可以正常转换,并返回一个有效的实例.

FIPreviewHandler是一个32位组件,在64位Win7机器上,如果我将我的客户端应用程序编译为"任何CPU",Activator.CreateInstance()将返回一个COM实例/ RCW(System .__ ComObject),因为它会查找64位实现FIPreviewHandler,因此返回一个代理.在这种情况下,我的应用程序工作正常.但是当我为x86编译它时,它获得32位实现,并返回实际托管类的托管实例,而不是COM实例,因此失败.

我不能使用FIPreviewHandler程序集中定义的接口,因为我必须为IPreviewHandler编写通用客户端,我的应用程序将与任何实现IPreviewHandler的组件一起使用,这对于基于C++的客户端访问FIPreviewHandler作为COM对象非常有用,但是失败了对于托管客户端.

我希望我有意义,我真的很感激任何帮助.

c# com proxy interop marshalling

16
推荐指数
1
解决办法
2289
查看次数

"马歇尔"还是"元帅"?"编组"还是"编组"?

在编程环境中它是哪一个?有区别吗?我已经看到了两种方式,我不想在我的代码中拼写错误.

terminology marshalling

16
推荐指数
1
解决办法
2万
查看次数

Java:编组对象 - 在xml中删除额外的ns2注释

我试图根据定义的模式将对象中的数据编组到xml文件中.但是,当我打印出xml文件时,我在xml标签上收到了额外的注释.有没有办法摆脱额外的命名空间注释(即ns2)

这是我从编组中收到的xml的一个例子.

<?xml version="1.0" encoding="UTF-8" standalone="yes">
<root xmlns:ns2="http://www.something.com/something">
    <ns2:food>steak</ns2:food>
    <ns2:beverage>water</ns2:beverage>
</root>
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的:

<?xml version="1.0" encoding="UTF-8" standalone="yes">
<root xmlns="http://www.something.com/something">
    <food>steak</food>
    <beverage>water</beverage>
</root>
Run Code Online (Sandbox Code Playgroud)

这就是我的Java代码正在做的事情:

            JAXBContext context = JAXBContext.newInstance("com.schema");
            JAXBElement<FoodSchema> element = new JAXBElement<FoodSchema>
                (new QName("FoodSchema"), Food.class, foodSchema);
            Marshaller marshaller = context.createMarshaller();
            OutputStream os = new FileOutputStream(object.getFilePath());
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
            marshaller.marshal(element, os);
Run Code Online (Sandbox Code Playgroud)

任何帮助深表感谢!谢谢!

java xml jaxb marshalling xml-namespaces

16
推荐指数
2
解决办法
3万
查看次数

检查类型是否为blittable的最快方法?

在我的serialiser/deserialiser中,我有以下代码段:

    if (element_type.IsValueType && collection_type.IsArray)
    {
        try
        {
            GCHandle h = GCHandle.Alloc(array_object, GCHandleType.Pinned);
            int arrayDataSize = Marshal.SizeOf(element_type) * c.Count;
            var array_data = new byte[arrayDataSize];
            Marshal.Copy(h.AddrOfPinnedObject(), array_data, 0, arrayDataSize);
            h.Free();
            WriteByteArray(array_data);

            return;
        }
        catch (ArgumentException)
        {
            //if the value type is not blittable, then we need to serialise each array item one at a time
        }
    }
Run Code Online (Sandbox Code Playgroud)

其目的是尝试以尽可能最有效的方式(即,仅将内容作为一堆字节)写入流中的值类型数组.

当类型是值类型但不是blittable时,问题就出现了,Alloc()失败了.此时捕获异常并将控制权传递给处理数组的代码,就好像它由引用类型组成一样.

然而,由于我的应用程序中遇到的值类型的数量,此检查(由于抛出并捕获我理解的异常非常慢)被证明是严重的瓶颈.所以我想知道,检查类型是否是blittable的最快方法是什么?

c# serialization marshalling value-type blit

16
推荐指数
2
解决办法
2529
查看次数

我可以使用SafeHandle而不是IntPtr吗?

我在网上广泛搜索但没有找到一个好的解释.

我的问题非常简单.

我有一个DLL,它有一个名为Initialize的函数,其中一个参数是一个指针,它将接收一个句柄,用于后续调用.另一个参数是一个字符串,我将列出完整性.我正在使用的签名是(简单形式):

[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);
Run Code Online (Sandbox Code Playgroud)

DLL本身的签名写为:Initialize(LPTSTR name, HANDLE handle)注释"HANDLE:指向将接收句柄的位置".

随后的电话采取的形式

[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);
Run Code Online (Sandbox Code Playgroud)

我一直在阅读SafeHandle,我想知道我是否可以用它来替代我的IntPtr句柄.如果可以的话,我该怎么做?扩展抽象的SafeHandle类不是问题,但我可以直接用IntPtr替换SafeHandle(并使用默认编组)或者我是否需要做一些额外的事情?

c# pinvoke handle marshalling

16
推荐指数
1
解决办法
1万
查看次数

getter与setter与成员之间的JAXB注释之间的区别是什么?

标题说明了一切.

我想知道@XmlElement在字段/ getter/setter上放置JAXB注释(如)之间的主要区别是什么.在我看来(在简单的情况下)它并不重要.

我们拿这个吧

class A  {
    private String a;

    public String getA() { return a; }

    public void setA(String a) { this.a = a; }
}
Run Code Online (Sandbox Code Playgroud)

现在在我看来,如果我放置@XmlElement成员字段或getter/setter 并不重要.它只是编组好的.当我需要做出改变并且什么时候重要时,是否有任何用例?

当我去解组这个(xml回到A)JAXB具体做什么?

我正在使用JAXB MOXy实现

谢谢

java xml jaxb marshalling unmarshalling

16
推荐指数
1
解决办法
1万
查看次数