我偶然发现Unity和iOS出现了一个很奇怪的问题,但我不知道问题的真正出处。
我有一个C#文件和一些数据,这些数据可以从JSON转换回C#对象,因此我使用DataContract实现了这一点。代码看起来像这样
namespace MyNameSpace
{
public sealed class AVDeviceStore
{
[DataContract(Name = "MyNameSpace", Namespace = "https://www.bla.io")]
abstract public class AVDevice
{
public AVDevice(string name, string id)
{
DeviceNum = 9999; // unset
DeviceName = name;
DeviceID = id;
Occupied = false;
}
[DataMember]
public uint DeviceNum { get; internal set; }
[DataMember]
public string DeviceID { get; private set; }
[DataMember]
public string DeviceName { get; private set; }
}
[DataContract(Name = "MyNameSpace", Namespace = "https://www.bla.io")]
public sealed class AudioInputDevice : AVDevice
{
}
...
}
}
实际上,我通过这种方式反序列化了同一类(AVDeviceStore)中的字符串:
...
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonstring)))
{
// Deserialization from JSON
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(AVDeviceStore));
listing = (AVDeviceStore)deserializer.ReadObject(ms);
...
}
这就是陷阱。如果我在实际的Unity项目中编译了此C#源代码(AVDeviceStore.cs),并且构建了IOS应用程序(Unity-> XCode-> iPhone),则此方法有效。但是,此代码是较大代码库的一部分,因此我实际上将AVDeviceStore.cs(以及一些其他文件)编译到了Assembly中,并仅将C#托管的AVDevice.dll提供给Unity。
这适用于我测试过的所有平台(Windows,UWP,OSX,Linux),但是在iOS上,我收到以下错误消息:
InvalidDataContractException: Error on deserializing read-only members in the class: No set method for property 'DeviceName' in type 'MyNameSpace.AVDeviceStore+AVDevice'.
基本上:
我实际上不知道-这是iOS上的权限问题吗?