Как сериализовать нестатический дочерний класс статического класса
Я хочу сериализовать довольно обычный класс, но выгода заключается в том, что он вложен в статический класс, подобный этому:
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.