Last active
December 21, 2015 22:18
-
-
Save jbouy/6373961 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace SerializableExceptions | |
{ | |
using System; | |
using System.Collections.Generic; | |
using System.Runtime.Serialization; | |
using System.Security.Permissions; | |
[Serializable] | |
public sealed class DerivedSerializableExceptionWithAdditionalCustomProperty : SerializableExceptionWithCustomProperties | |
{ | |
private readonly string username; | |
public DerivedSerializableExceptionWithAdditionalCustomProperty() | |
{ | |
} | |
public DerivedSerializableExceptionWithAdditionalCustomProperty(string message) | |
: base(message) | |
{ | |
} | |
public DerivedSerializableExceptionWithAdditionalCustomProperty(string message, Exception innerException) | |
: base(message, innerException) | |
{ | |
} | |
public DerivedSerializableExceptionWithAdditionalCustomProperty(string message, string username, string resourceName, IList<string> validationErrors) | |
: base(message, resourceName, validationErrors) | |
{ | |
this.username = username; | |
} | |
public DerivedSerializableExceptionWithAdditionalCustomProperty(string message, string username, string resourceName, IList<string> validationErrors, Exception innerException) | |
: base(message, resourceName, validationErrors, innerException) | |
{ | |
this.username = username; | |
} | |
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] | |
// Serialization constructor is private, as this class is sealed | |
private DerivedSerializableExceptionWithAdditionalCustomProperty(SerializationInfo info, StreamingContext context) | |
: base(info, context) | |
{ | |
this.username = info.GetString("Username"); | |
} | |
public string Username | |
{ | |
get { return this.username; } | |
} | |
public override void GetObjectData(SerializationInfo info, StreamingContext context) | |
{ | |
if (info == null) | |
{ | |
throw new ArgumentNullException("info"); | |
} | |
info.AddValue("Username", this.username); | |
base.GetObjectData(info, context); | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace SerializableExceptions | |
{ | |
using System; | |
using System.Collections.Generic; | |
using System.Runtime.Serialization; | |
using System.Security.Permissions; | |
[Serializable] | |
// Important: This attribute is NOT inherited from Exception, and MUST be specified | |
// otherwise serialization will fail with a SerializationException stating that | |
// "Type X in Assembly Y is not marked as serializable." | |
public class SerializableExceptionWithCustomProperties : Exception | |
{ | |
private readonly string resourceName; | |
private readonly IList<string> validationErrors; | |
public SerializableExceptionWithCustomProperties() | |
{ | |
} | |
public SerializableExceptionWithCustomProperties(string message) | |
: base(message) | |
{ | |
} | |
public SerializableExceptionWithCustomProperties(string message, Exception innerException) | |
: base(message, innerException) | |
{ | |
} | |
public SerializableExceptionWithCustomProperties(string message, string resourceName, IList<string> validationErrors) | |
: base(message) | |
{ | |
this.resourceName = resourceName; | |
this.validationErrors = validationErrors; | |
} | |
public SerializableExceptionWithCustomProperties(string message, string resourceName, IList<string> validationErrors, Exception innerException) | |
: base(message, innerException) | |
{ | |
this.resourceName = resourceName; | |
this.validationErrors = validationErrors; | |
} | |
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] | |
// Constructor should be protected for unsealed classes, private for sealed classes. | |
// (The Serializer invokes this constructor through reflection, so it can be private) | |
protected SerializableExceptionWithCustomProperties(SerializationInfo info, StreamingContext context) | |
: base(info, context) | |
{ | |
this.resourceName = info.GetString("ResourceName"); | |
this.validationErrors = (IList<string>)info.GetValue("ValidationErrors", typeof(IList<string>)); | |
} | |
public string ResourceName | |
{ | |
get { return this.resourceName; } | |
} | |
public IList<string> ValidationErrors | |
{ | |
get { return this.validationErrors; } | |
} | |
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)] | |
public override void GetObjectData(SerializationInfo info, StreamingContext context) | |
{ | |
if (info == null) | |
{ | |
throw new ArgumentNullException("info"); | |
} | |
info.AddValue("ResourceName", this.ResourceName); | |
// Note: if "List<T>" isn't serializable you may need to work out another | |
// method of adding your list, this is just for show... | |
info.AddValue("ValidationErrors", this.ValidationErrors, typeof(IList<string>)); | |
// MUST call through to the base class to let it save its own state | |
base.GetObjectData(info, context); | |
} | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace SerializableExceptions | |
{ | |
using System; | |
using System.Runtime.Serialization; | |
[Serializable] | |
// Important: This attribute is NOT inherited from Exception, and MUST be specified | |
// otherwise serialization will fail with a SerializationException stating that | |
// "Type X in Assembly Y is not marked as serializable." | |
public class SerializableExceptionWithoutCustomProperties : Exception | |
{ | |
public SerializableExceptionWithoutCustomProperties() | |
{ | |
} | |
public SerializableExceptionWithoutCustomProperties(string message) | |
: base(message) | |
{ | |
} | |
public SerializableExceptionWithoutCustomProperties(string message, Exception innerException) | |
: base(message, innerException) | |
{ | |
} | |
// Without this constructor, deserialization will fail | |
protected SerializableExceptionWithoutCustomProperties(SerializationInfo info, StreamingContext context) | |
: base(info, context) | |
{ | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment