Как сериализовать класс со сложным свойством, используя сериализацию XML в .NET? - PullRequest
0 голосов
/ 15 октября 2010

Я хочу сериализовать класс. В этом классе есть свойство типа 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", если да, извлеките каждое значение из строки.

Но этот путь кажется неуклюжим и намного больше похож на обходной путь. Интересно, есть ли более профессиональный способ сделать это? Мой рецензент очень разборчив, и он не примет такое решение. Если вы знаете способ, не могли бы вы поделиться им со мной? Большое спасибо.

1 Ответ

1 голос
/ 15 октября 2010

Существует множество способов использовать встроенную сериализацию.

Самым простым и старым является атрибут [Serializable], который указывает .NET на сериализацию членов.

Вы также можете использовать WCF.Атрибут [DataContract] для сериализации.

Существует также интерфейс IXMLSerializable, который позволяет вам реализовывать пользовательские программы чтения и записи XML для ваших классов.

Суть в том, что нетнужно накатить самостоятельно - это было сделано.

...