NET, C#: How to add a custom serialization attribute that acts as ISerializable interface?

Yes, you can do this by implementing ISerializationSurrogate and ISurrogateSelector interfaces.

Up vote 5 down vote favorite 3 share g+ share fb share tw.

I am doing some serialization of db linq objects, which contain EntitySet and EntityRef classes. I found a pretty easy way to deal with serialization of these classes, by simply using ISerializable to properly handle members of this type (converting them to lists for serialization, and undoing it on deserialization). However, it would be really nice if I could do: Serializable SerializeLinqEntities partial class Person { ... } Instead of: partial class Person : ISerializable { public virtual void GetObjectData( SerializationInfo si, StreamingContext ctxt ) { EntitySerializer.

Serialize(this, typeof(Person), si, ctxt); } protected Person( SerializationInfo si, StreamingContext ctxt ) { EntitySerializer. Deerialize(this, typeof(Person), si, ctxt); } } Is there a way to do this? I looked through the serialization classes and couldn't seem to find any way to setup custom serialization filter routines (where I could look for my custom attribute).

Thanks! C# .net serialization custom-attributes link|improve this question asked Feb 1 '10 at 4:01marq20328 50% accept rate.

Looks like IClientFormatterSinkProvider and IServerFormatterSinkProvider will allow me to provide a BinaryFormatter with my custom SurrogateSelector set. Thanks again Sergey! – marq Feb 1 '10 at 18:28 Hmm... so, as it turns out, Microsoft has made this a lot more difficult than it looks.

See the following link: 123aspx.com/Rotor/RotorSrc.aspx?rot=40027 Sink providers, as it turns out, are quite complex, and it's not as simple as just implementing one. I really wish they'd provided better interface API's to interface with binary serialization... – marq Feb 3 '10 at 5:45.

Yes, you can do this by implementing ISerializationSurrogate and ISurrogateSelector interfaces. Something like this: AttributeUsage(AttributeTargets. Class) public class SerializeLinqEntities : Attribute { } public class LinqEntitiesSurrogate : ISerializationSurrogate { public void GetObjectData( object obj, SerializationInfo info, StreamingContext context) { EntitySerializer.

Serialize(this, obj.GetType(), info, context); } public object SetObjectData( object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector) { EntitySerializer. Deerialize(obj, obj.GetType(), info, context); return obj; } } /// /// Returns LinqEntitySurrogate for all types marked SerializeLinqEntities /// public class NonSerializableSurrogateSelector : ISurrogateSelector { public void ChainSelector(ISurrogateSelector selector) { throw new NotImplementedException(); } public ISurrogateSelector GetNextSelector() { throw new NotImplementedException(); } public ISerializationSurrogate GetSurrogate( Type type, StreamingContext context, out ISurrogateSelector selector) { if (!type. IsDefined(typeof(SerializeLinqEntities), false)) { //type not marked SerializeLinqEntities selector = null; return null; } selector = this; return new LinqEntitiesSurrogate(); } } SerializeLinqEntities public class TestSurrogate { public int Id { get; set; } public string Name { get; set; } } class Program { static void Main(string str) { var ns1 = new TestSurrogate {Id = 47, Name = "TestName"}; var formatter = new BinaryFormatter(); formatter.

SurrogateSelector = new NonSerializableSurrogateSelector(); using (var ms = new MemoryStream()) { formatter. Serialize(ms, ns1); ms. Position = 0; var ns2 = (TestSurrogate) formatter.

Deserialize(ms); // Check serialization Debug. Assert(ns1. Id == ns2.

Id); Debug. Assert(ns1. Name == ns2.

Name); } } }.

That is exactly what I want (ISurrogateSelector is exactly what I was looking for). So, final question - is there a way to use this with automated serialization? My serializing is happening via an RPC call (using a MarshalByRefObject).

– marq Feb 1 '10 at 16:24 +1 I didn't even think of ISerializationSurrogate because the question explicitly mentioned attributes. The only problem with this solution comes when you don't have access to the formatter instance to set the SurrogateSelector property. – Rory Feb 1 '10 at 16:28 In WCF you can easily use surrogates (msdn.microsoft.com/en-us/library/ms73306...).

I don't used surrogates with .net remoting. Maybe Custom Sinks can helps you (codeproject.com/KB/IP/customsinks.aspx). – Sergey Teplyakov Feb 1 '10 at 18:17.

Unfortunately no, ISerializable is an interface designed to allow you to control the serialization process while the SerializableAttribute is just a marker that says "this class can be serialized". However, you could look into something like PostSharp to add this functionality (take a look at the CompositionAspect).

I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.

Related Questions