В моем приложении есть класс CoupledType
, который используется в более крупном объекте типа UserObject
, где его экземпляры сохраняются путем сериализации с использованием Json.NET и хранятся в базе данных.Convert Class on Json Deserialization
Этот класс нуждается в существенном рефакторинге, чтобы он работал в большем количестве контекстов. Его имя также не идеально, и я бы хотел переместить его в другую библиотеку. Тем не менее, он все равно будет распространять один и тот же базовый класс и, самое главное, , когда пользователи десериализуют сохраненную работу, исходный экземпляр должен быть преобразован.
Класс в его текущем состоянии выглядит, примерно, так:
namespace FirstLibrary.Objects
{
[DataContract]
public class CoupledType : BaseType
{
[DataMember]
public double CoupledValue { get; set; }
}
}
И типа я хочу, чтобы преобразовать его выглядит следующим образом:
namespace SecondLibrary.Objects
{
[DataContract]
public class DecoupledType : BaseType
{
[DataMember]
GenericContract Contract { get; set; }
}
}
GenericContract
класс упомянутый выше выглядит следующим образом:
[DataContract]
public class GenericContract
{
[DataMember]
public ContractType ContractType { get; set; }
[DataMember]
public double ContractValue { get; set; }
}
В процессе преобразования процесс, я хотел бы создать новый объект GenericContract
, получив ContractType
из другого места (его значение всегда будет таким же, в этом преобразовании), а значение ContractValue
будет установлено на значение оригинала CoupledValue
от .
Потенциально более сложная часть - это то, где мне нужен доступ к родительскому объекту этого объекта UserObject
(то есть к его десериализации), чтобы получить ссылку на значение ContractType
.
Подводя итог, нужно написать конвертер для Json.NET, который делает следующее:
- Изменить имя типа объекта от
FirstLibrary.Objects.CoupledType
кSecondLibrary.Objects.DecoupledType
- Заменить
double CoupledValue
сGenericContract Contract
(конструкция которого требует доступа кParentObject
, этот экземплярCoupledType
является членом /, десериализуемым от.
У меня нет большого опыта конвертирования типов в Json (написав подкласс Json.Net
JsonConverter
, чтобы преобразовать число double
объектов в double[]
s. У меня нет опыта изменения имен типов или свойств. Если бы кто-нибудь мог хотя бы указать мне на потенциальное решение, это было бы очень признательно.
Образец Существующие (спекулятивный, так как на самом деле сериализовать в BSON)
{
"$type": "FirstLibrary.Objects.CoupledType",
"CoupledValue": 4
}
{
"$type": "SecondLibrary.Objects.DecoupledType",
"Contract": {
"$type": "SecondLibrary.Objects.GenericContract",
"ContractType": {/*Refers to an object serialized elsewhere*/},
"ContractValue": 4
}
}
Если это помогает, то настройки сериализации следующим образом:
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
TypeNameHandling = TypeNameHandling.All
Вы можете предоставить компактный и небольшой образец того, что вы хотите, и где он идет не так? –
Обновленный вопрос, с надеждой, более четкое определение проблемы. Благодаря! –
опубликуйте образец сериализованного json и десериализованную форму, которую вы хотите увидеть. –