.NET 4.x жалуется на десериализацию закрытых свойств в отличие от .NET 3.5 - как это исправить? - PullRequest
0 голосов
/ 16 октября 2019

Я обновил среду выполнения сценариев Unity моего проекта с .Net 3.5 до 4.x. Во время выполнения, когда дело доходит до десериализации XML-файла, он выдает мне следующую ошибку:

InvalidOperationException: Невозможно десериализовать тип 'xxxxxx.Module.Impl.WebModule' , поскольку он содержит свойство 'wellConfig ', у которого нет открытого установщика. System.Xml.Serialization.TypeScope.GetSettableMembers (отображение System.Xml.Serialization.StructMapping, список System.Collections.ArrayList)

Это связаносвойство:

[XmlElement("WebWellConfiguration")]
public WebWellConfiguration wellConfig { get; protected set; }

Когда я удаляю модификатор защищенного доступа, ошибка исчезает, и десериализация проходит успешно, но я не хочу этого делать.

  • Почему у среды выполнения сценариев Unity 3.5 нет проблем с десериализацией закрытого установщика, но 4.x не удается это сделать?
  • Как исправить проблему, не удаляямодификатор защищенного или закрытого доступа?

1 Ответ

0 голосов
/ 17 октября 2019

Вы можете просто использовать private вспомогательное поле, используя [SerializeField] вместо

[XmlElement("WebWellConfiguration")] 
// [SerializeField] allows to mark private fields for serialization
[SerializeField] private WebWellConfiguration wellConfig;

// since this is now no longer an auto-property but
// using a backing field this one won't be serialized at all
public WebWellConfiguration WellConfig 
{ 
    get { return wellConfig; } 
    protected set { wellConfig = value; }
}

Еще один дополнительный побочный эффект этого: вы теперь также должны иметь возможностьпосмотрите и настройте это поле с помощью Unity Inspector!


Предположим, что WebWellConfiguration в любом случае уже [Serializable], иначе его нельзя было бы (де) сериализовать ввсе.

...