Как сериализовать нестатический дочерний класс статического класса

Я хочу сериализовать довольно обычный класс, но выгода заключается в том, что он вложен в статический класс, подобный этому:

public static class StaticClass
{
    [Serializable]
    public class SomeType
    {
        ...
    }
}

Этот код:

StaticClass.SomeType obj = new StaticClass.SomeType();
XmlSerializer mySerializer = new XmlSerializer(typeof(obj));

Выдает эту ошибку:

StaticClass.SomeType cannot be serialized. Static types cannot be used as parameters or return types.

Эта ошибка кажется совершенно неактуальной; StaticClass.SomeType не является статическим типом.

Это можно обойти? Я ошибаюсь, считая эту ошибку глупой?

3 ответа

Решение

Как прагматичный обходной путь - не отмечайте тип вложенности static:

public class ContainerClass
{
    private ContainerClass() { // hide the public ctor
        throw new InvalidOperationException("no you don't");
    }

    public class SomeType
    {
        ...
    }
}

Это известное ограничение в XmlSerializer ()

И обходной путь заключается в использовании DataContractSerializer (DataContractAttribute + DataMemberAttribute)

var ser = new DataContractSerializer(typeof (StaticClass.SomeType));
var obj = new StaticClass.SomeType {Int = 2};
ser.WriteObject(stream, obj);

...

static class StaticClass
{
    [DataContract]
    public class SomeType
    {
        [DataMember]
        public int Int { get; set; }
    }
}

Как видите, DataContractSerializer даже не требует StaticClass быть публичным. Разница в том, что вы должны использовать WriteObject' andВместо этого ReadObject' Serialize а также Deserialize

Либо сделайте класс не вложенным, либо используйте вместо него DataContractSerializer.

Другие вопросы по тегам