Я наткнулся на довольно странную проблему с 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);
...
}
В этом и заключается подвох.Это работает, если у меня есть исходный код C # (AVDeviceStore.cs), скомпилированный в реальном проекте Unity, и я создаю приложение IOS (Unity-> XCode-> iPhone).Однако этот код является частью большей кодовой базы, поэтому я фактически скомпилировал AVDeviceStore.cs (вместе с некоторыми другими файлами) в сборку и просто предоставил управляемый 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'.
В основном:
- компиляция кода внутри приложения Unity работает на iOS
- предварительная компиляция кода и предоставление DLL разбивает его.
На самом деле я понятия не имею - это проблема с разрешением на iOS как-то?