问题
I am using BinaryFormatter to serialize a class and its variables by condition. For example:
[Serializable]
public class Class1
{
private Class2 B;
...
}
[Serializable]
public class Class2{...}
I want the variable B to be serialized only when remoting time, but not when i serialize it to file storage.
Questions:
1) I know that in XmlSerialization we can use [XmlIgnore] and {PropertyName}Specified to ignore the property conditionally. Is that a equivalent method for [NonSerialized]?
2) For a class with [Serializable] attribute, how to ignore it at the runtime?
回答1:
- There is no such method. You can control serialization by implementing
ISerializable
, and if you do you will know which serialization context is active (remoting, file etc.) - AFAIK no way to do it, why do you want this?
Generally speaking I advise you against using BinaryFormatter
. It is a maintenance headache if there ever was one. Use XML serialization or some kind of protocol buffers.
回答2:
As already mentioned, it doesn't exist. You could code your way out of although it is a bit messy (that is if you don't want to implement the ISerializable interface as already suggested).
[Serializable] public class ClassA { [OnSerializing] private void OnSerializing(StreamingContext context) { //Set BSerialized = B based on context or some internal boolean BSerialized = B; } [OnSerialized] private void OnSerialized(StreamingContext context) { //Clear BSerialized BSerialized = null; } [OnDeserialized] private void OnDeserialized(StreamingContext context) { //Restore B from BSerialized B = BSerialized; BSerialized = null; } [NonSerialized] private ClassB B; private ClassB BSerialized; } [Serializable] public class ClassB { }
You can't ignore it. You can only change properties on attributes at runtime and since the NonSerialized attribute doesn't take a true / false argument, you cannot do anything about it runtime.
回答3:
I wrote a rather simple but extensible framework to solve this sort of problem using bindings. Not sure I completely understand but this is possible:
public class Class1
{
[Ignore]
public bool IsRemoting { get; set; }
[SerializeWhen("IsRemoting", true)]
public Class2 B;
}
http://binaryserializer.codeplex.com
来源:https://stackoverflow.com/questions/3648858/conditional-c-sharp-binary-serialization