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