问题
I want to serialize a pretty ordinary class, but the catch is it's nested in a static class like this:
public static class StaticClass
{
[Serializable]
public class SomeType
{
...
}
}
This code:
StaticClass.SomeType obj = new StaticClass.SomeType();
XmlSerializer mySerializer = new XmlSerializer(typeof(obj));
Produces this error:
StaticClass.SomeType cannot be serialized. Static types cannot be used as parameters or return types.
That error seems completely irrelevant; StaticClass.SomeType
is not a static type.
Is there a way around this? Am I wrong to think this error is dumb?
回答1:
As a pragmatic workaround - don't mark the nesting type static
:
public class ContainerClass
{
private ContainerClass() { // hide the public ctor
throw new InvalidOperationException("no you don't");
}
public class SomeType
{
...
}
}
回答2:
It's know limitation in XmlSerializer ()
And workaround is to use 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; }
}
}
As you can see DataContractSerializer doesn't even require StaticClass
to be public. One difference is that you should use WriteObject' and
ReadObject' instead Serialize
and Deserialize
回答3:
Either make the class non nested or consider using the DataContractSerializer instead.
来源:https://stackoverflow.com/questions/4479817/how-to-serialize-non-static-child-class-of-static-class