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

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

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 не является статическим типом.

Есть ли способ обойти это? Я ошибаюсь, думая, что эта ошибка немой?

Ответ 1

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

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

    public class SomeType
    {
        ...
    }
}

Ответ 2

Он знает ограничение в 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 был общедоступным. Одно отличие состоит в том, что вместо Serialize и Deserialize

следует использовать WriteObject' and ReadObject '

Ответ 3

Либо сделайте класс не вложенным, либо рассмотрите вместо этого DataContractSerializer.