Why is this an issue?
Serialization event handlers that don’t have the correct signature will simply not be called, thus bypassing any attempts to augment the automated
de/serialization.
This rule raises an issue when a method marked with one of the following attributes is public
, static
, does not return
void
, has type parameters, or does not have a single parameter of type System.Runtime.Serialization.StreamingContext
:
-
System.Runtime.Serialization.OnSerializingAttribute
-
System.Runtime.Serialization.OnSerializedAttribute
-
System.Runtime.Serialization.OnDeserializingAttribute
-
System.Runtime.Serialization.OnDeserializedAttribute
Noncompliant code example
[Serializable]
public class Foo
{
[OnSerializing]
public void OnSerializing(StreamingContext context) {} // Noncompliant should be private
[OnSerialized]
int OnSerialized(StreamingContext context) {} // Noncompliant should return void
[OnDeserializing]
void OnDeserializing() {} // Noncompliant should have a single parameter of type StreamingContext
[OnSerializing]
public void OnSerializing2<T>(StreamingContext context) {} // Noncompliant should have no type parameters
[OnDeserialized]
void OnDeserialized(StreamingContext context, string str) {} // Noncompliant should have a single parameter of type StreamingContext
}
Compliant solution
[Serializable]
public class Foo
{
[OnSerializing]
private void OnSerializing(StreamingContext context) {}
[OnSerialized]
private void OnSerialized(StreamingContext context) {}
[OnDeserializing]
private void OnDeserializing(StreamingContext context) {}
[OnDeserialized]
private void OnDeserialized(StreamingContext context) {}
}