DLL中的iOS上的InvalidDataContractException(源工作)

时间:2019-02-20 11:08:57

标签: ios xcode unity3d c#-4.0 datacontract

我偶然发现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'.

基本上:

  1. 在Unity应用中编译代码可在iOS上运行
  2. 预编译代码并提供DLL会破坏它。

我实际上不知道-这是iOS上的权限问题吗?

0 个答案:

没有答案