InvalidDataContractException на iOS в DLL (работает источник) - PullRequest
0 голосов
/ 20 февраля 2019

Я наткнулся на довольно странную проблему с 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'.

В основном:

  1. компиляция кода внутри приложения Unity работает на iOS
  2. предварительная компиляция кода и предоставление DLL разбивает его.

На самом деле я понятия не имею - это проблема с разрешением на iOS как-то?

...