Я хочу сериализовать класс. В этом классе есть свойство типа Class1, которое, в свою очередь, имеет свои собственные свойства.
public abstract class ComponentBase
{
[ToSerialize] //An attribute defined my me, indicating whether or not to serialize this property.
public ComponentArgs Parameters { get; set; }
}
public class ComponentArgs
{
public string WorkingPath { get; set; }
public IList<Language> Languages { get; set; }
public string ComponentOutputPath { get; set; }
}
Сериализованная информация должна быть помещена в Dictionary<string,string>
, например,
ComponentSettings[str_Name] = str_Value;
Метод, используемый при чтении этого значения, является отражением
// pinfo: Property Info got via Type.GetProperties();
componentSettings.Add(pinfo.Name, pinfo.GetValue((object)this, null).ToString());
Информация после сериализации:
<Parameters>MS.STBIntl.Pippin.Framework.ComponentArgs</Parameters>
вместо значения ComponentArgs.WorkingPath
.
Решение, о котором я подумал, заключается в добавлении к следующей строке решения if:
componentSettings.Add(pinfo.Name, pinfo.GetValue((object)this, null).ToString());
if(pinfo is ComponentArgs)
componentSettings.Add(pinfo.Name, pinfo.GetValue(
(ComponentArgs)this, null).WorkingPath+"\n"+
LanguageList+"\n"+ //Language list is a concatinated string of all elements in the list.
(ComponentArgs)this, null).ComponentOutputPath+"\n"+
);
При десериализации добавьте оценку, содержит ли значение более 2 "\ n", если да, извлеките каждое значение из строки.
Но этот путь кажется неуклюжим и намного больше похож на обходной путь. Интересно, есть ли более профессиональный способ сделать это? Мой рецензент очень разборчив, и он не примет такое решение. Если вы знаете способ, не могли бы вы поделиться им со мной? Большое спасибо.