使用不可编码的组件对C结构进行编码/解码

使用不可编码的组件对C结构进行编码/解码,c,objective-c,swift,struct,encoding,C,Objective C,Swift,Struct,Encoding,我在C头中定义了一个结构,如: struct ComputeParameters { float scale; vector_float4 rgba; } 它必须在C中定义,而不是在Swift中定义,这是有原因的,所以我不能只是将编码协议添加到它中 我需要能够存储和恢复结构实例的内容-最好是从Swift,但如果需要,我可以创建Objective-C类对其进行编码 我试着用Obj-c编码: NSValue *structValue = [NSValue value:&co

我在C头中定义了一个结构,如:

struct ComputeParameters {
    float scale;
    vector_float4 rgba;
}
它必须在C中定义,而不是在Swift中定义,这是有原因的,所以我不能只是将编码协议添加到它中

我需要能够存储和恢复结构实例的内容-最好是从Swift,但如果需要,我可以创建Objective-C类对其进行编码

我试着用Obj-c编码:

NSValue *structValue = [NSValue value:&computeParams withObjCType:@encode(struct ComputeParameters)];
但我得到了这个错误:

“struct ComputeParameters”类型的编码不完整,因为“vector_float4”(又名“simd_float4”)组件的编码未知


除了对结构的每个组件(大约有3打组件)进行编码之外,还有更好的方法吗?

您可以访问结构的实际字节,然后将这些字节转换为
NSData
,但最终的结果是级别非常低且依赖于机器。这是您选择的一个极端,只要您具有相同的底层机器体系结构,它就可以正常工作。然后,您就可以用C编写整个实现,而不必使用
NSData/NSCoding

如果您使用
NSCoding
,那么它会有自己的一套限制,正如您所看到的,您需要使用它所提供的功能。有一些方便的低级函数,如
encodeInt64
,但最终还是要处理结构的各个成员。这是另一个极端,您为每个结构编码单个结构成员

如果您使用Objective-C,中间点可以是为每个结构创建一个类,以及从类中获取结构并从结构中初始化类的代码。然后您需要编码/解码每个类。这可能需要做很多工作,但如果能很好地集成到您的解决方案中,我认为这是更好/更易于维护的选择


最直接的方法是使用低级的
NSCoding
函数,但最终仍然会将每个结构成员映射到某个低级函数,但至少没有类来促进编码。然后,您可以为每个结构创建一个标识符,并在解码时使用该标识符,以了解需要创建和解码的结构。

您可以访问该结构的实际字节,然后将这些字节转换为
NSData
,但这会导致非常低的级别和机器依赖性。这是您选择的一个极端,只要您具有相同的底层机器体系结构,它就可以正常工作。然后,您就可以用C编写整个实现,而不必使用
NSData/NSCoding

如果您使用
NSCoding
,那么它会有自己的一套限制,正如您所看到的,您需要使用它所提供的功能。有一些方便的低级函数,如
encodeInt64
,但最终还是要处理结构的各个成员。这是另一个极端,您为每个结构编码单个结构成员

如果您使用Objective-C,中间点可以是为每个结构创建一个类,以及从类中获取结构并从结构中初始化类的代码。然后您需要编码/解码每个类。这可能需要做很多工作,但如果能很好地集成到您的解决方案中,我认为这是更好/更易于维护的选择


最直接的方法是使用低级的
NSCoding
函数,但最终仍然会将每个结构成员映射到某个低级函数,但至少没有类来促进编码。然后,您可以为每个结构创建一个标识符,并在解码时使用该标识符,以了解需要创建和解码的结构。

SIMD符合CodableHmmm-我将其更改为SIMD_float4,但得到相同的错误,并且向量_float4似乎是相同的类型(错误中很明显)。我不知道如何在obj-c中编码。你不能用NSJSONSerialization对它进行编码吗?使用vector_float4创建一个结构意味着您可以将它与金属实现一起使用。知道了这一点,你不更容易看到你的金属缓冲饲料的地方吗?如果这部分是用对象来塑造缓冲区,那么这个对象结构就是您可能想要编码的。编码直接进入金属缓冲区的东西并不是一个好主意。当您试图避免创建特殊数据类型时,您可以充分利用NSCoder的SecureCoding功能。您想将其编码到内存还是文件中?从后来的文件解码来看?SIMD符合CodableHmmm-我将其更改为SIMD_float4,但得到了相同的错误,并且向量_float4似乎是相同的类型(在错误中很明显)。我不知道如何在obj-c中编码。你不能用NSJSONSerialization对它进行编码吗?使用vector_float4创建一个结构意味着您可以将它与金属实现一起使用。知道了这一点,你不更容易看到你的金属缓冲饲料的地方吗?如果这部分是用对象来塑造缓冲区,那么这个对象结构就是您可能想要编码的。编码直接进入金属缓冲区的东西并不是一个好主意。当您试图避免创建特殊数据类型时,您可以充分利用NSCoder的SecureCoding功能。您想将其编码到内存还是文件中?从那以后的文件解码?