diff --git a/src/Spring/Spring.Aop/Aop/Framework/AdvisedSupport.cs b/src/Spring/Spring.Aop/Aop/Framework/AdvisedSupport.cs
index dedd5209..7ca9cc5c 100644
--- a/src/Spring/Spring.Aop/Aop/Framework/AdvisedSupport.cs
+++ b/src/Spring/Spring.Aop/Aop/Framework/AdvisedSupport.cs
@@ -236,7 +236,7 @@ namespace Spring.Aop.Framework
///
/// true if this instance can be serialized, false otherwise.
///
- public bool IsSerializable
+ public virtual bool IsSerializable
{
get
{
diff --git a/src/Spring/Spring.Aop/Aop/Framework/DynamicProxy/AdvisedProxy.cs b/src/Spring/Spring.Aop/Aop/Framework/DynamicProxy/AdvisedProxy.cs
index 9ef9b3ea..55b7b4b7 100644
--- a/src/Spring/Spring.Aop/Aop/Framework/DynamicProxy/AdvisedProxy.cs
+++ b/src/Spring/Spring.Aop/Aop/Framework/DynamicProxy/AdvisedProxy.cs
@@ -142,7 +142,7 @@ namespace Spring.Aop.Framework.DynamicProxy
/// Serialization data.
/// Serialization context.
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
- public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
+ protected virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("advised", m_advised);
info.AddValue("introductions", m_introductions);
diff --git a/src/Spring/Spring.Aop/Aop/Framework/DynamicProxy/BaseCompositionAopProxy.cs b/src/Spring/Spring.Aop/Aop/Framework/DynamicProxy/BaseCompositionAopProxy.cs
index 2ce944f0..7de3460a 100644
--- a/src/Spring/Spring.Aop/Aop/Framework/DynamicProxy/BaseCompositionAopProxy.cs
+++ b/src/Spring/Spring.Aop/Aop/Framework/DynamicProxy/BaseCompositionAopProxy.cs
@@ -62,6 +62,14 @@ namespace Spring.Aop.Framework.DynamicProxy
protected BaseCompositionAopProxy(SerializationInfo info, StreamingContext context) : base(info, context)
{}
+ ///
+ ///Populates a with the data needed to serialize the target object.
+ ///
+ void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ base.GetObjectData(info, context);
+ }
+
#endregion
#region IAopProxy Members
diff --git a/src/Spring/Spring.Aop/Aop/Framework/DynamicProxy/DefaultAopProxyFactory.cs b/src/Spring/Spring.Aop/Aop/Framework/DynamicProxy/DefaultAopProxyFactory.cs
index 64aa17d9..d5a36e24 100644
--- a/src/Spring/Spring.Aop/Aop/Framework/DynamicProxy/DefaultAopProxyFactory.cs
+++ b/src/Spring/Spring.Aop/Aop/Framework/DynamicProxy/DefaultAopProxyFactory.cs
@@ -20,10 +20,11 @@
#region Imports
-using System;
-
+using System;
+using System.Reflection;
using Spring.Proxy;
-using Spring.Aop.Target;
+using Spring.Aop.Target;
+using Spring.Util;
#endregion
@@ -53,6 +54,13 @@ namespace Spring.Aop.Framework.DynamicProxy
[Serializable]
public class DefaultAopProxyFactory : IAopProxyFactory
{
+ ///
+ /// Force transient assemblies to be resolvable by .
+ ///
+ static DefaultAopProxyFactory()
+ {
+ SystemUtils.RegisterLoadedAssemblyResolver();
+ }
///
/// Creates an for the
diff --git a/test/Spring/Spring.Aop.Tests/Aop/Framework/DynamicProxy/AbstractAopProxyTests.cs b/test/Spring/Spring.Aop.Tests/Aop/Framework/DynamicProxy/AbstractAopProxyTests.cs
index e3a42e59..49c4dcbb 100644
--- a/test/Spring/Spring.Aop.Tests/Aop/Framework/DynamicProxy/AbstractAopProxyTests.cs
+++ b/test/Spring/Spring.Aop.Tests/Aop/Framework/DynamicProxy/AbstractAopProxyTests.cs
@@ -21,6 +21,10 @@
#region Imports
using System;
+using System.IO;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters;
+using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
using System.Reflection;
using System.Collections;
@@ -67,7 +71,7 @@ namespace Spring.Aop.Framework.DynamicProxy
[TestFixtureSetUp]
public void FixtureSetUp()
{
- SystemUtils.RegisterLoadedAssemblyResolver();
+// SystemUtils.RegisterLoadedAssemblyResolver();
}
[SetUp]
@@ -95,6 +99,134 @@ namespace Spring.Aop.Framework.DynamicProxy
return (IAopProxy)proxyCtorInfo.Invoke(new object[] { advisedSupport });
}
+ #region Serialization Tests
+
+ private object SerializeAndDeserialize(object s)
+ {
+ // Serialize the session
+ using (Stream stream = new MemoryStream())
+ {
+ BinaryFormatter formatter = new BinaryFormatter();
+ formatter.AssemblyFormat = FormatterAssemblyStyle.Full;
+ formatter.TypeFormat = FormatterTypeStyle.TypesAlways;
+ formatter.Serialize(stream, s);
+
+ // Deserialize the session
+ stream.Position = 0;
+ object res = formatter.Deserialize(stream);
+ return res;
+ }
+ }
+
+ public interface ISerializableTestObject
+ {
+ string TestData { get; set; }
+ }
+
+ [Serializable]
+ public class SerializableTestObject : ISerializableTestObject, IDeserializationCallback
+ {
+ public static int InstanceCount;
+
+ public SerializableTestObject()
+ {
+ InstanceCount++;
+ }
+
+ public string TestData { get { return testData; } set { testData = value; } }
+
+ private string testData;
+
+ public void OnDeserialization(object sender)
+ {
+ // only count non-proxy type deserializations
+ if (!AopUtils.IsAopProxy(this))
+ {
+ InstanceCount++;
+ }
+ }
+ }
+
+ [Serializable]
+ public class CustomSerializableTestObject : ISerializableTestObject, ISerializable, IDeserializationCallback
+ {
+ public static int InstanceCount;
+
+ public CustomSerializableTestObject()
+ {
+ InstanceCount++;
+ }
+
+ protected CustomSerializableTestObject(SerializationInfo info, StreamingContext context)
+ {
+ TestData = info.GetString("testData");
+ }
+
+ public void GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ info.AddValue("testData", TestData);
+ }
+
+ public string TestData { get { return testData; } set { testData = value; } }
+
+ public void OnDeserialization(object sender)
+ {
+ if (!AopUtils.IsAopProxy(this))
+ {
+ InstanceCount++;
+ }
+ }
+
+ [NonSerialized]
+ private string testData;
+ }
+
+ [Test]
+ public void CanSerializeDeserializeSerializable()
+ {
+ int instanceCount;
+ ISerializableTestObject target = new SerializableTestObject();
+ target.TestData = "testData";
+ AdvisedSupport advised = new AdvisedSupport();
+ advised.Target = target;
+ advised.Interfaces = new Type[] { typeof(ISerializableTestObject) };
+ // advised.AddAdvisor(new DefaultPointcutAdvisor(new NopInterceptor()));
+
+ ISerializableTestObject to = (ISerializableTestObject)CreateAopProxy(advised);
+
+ instanceCount = SerializableTestObject.InstanceCount;
+ to = (ISerializableTestObject)SerializeAndDeserialize(to);
+
+ // new instance was created
+ Assert.AreEqual(instanceCount + 1, SerializableTestObject.InstanceCount);
+ // values were (de-)serialized
+ Assert.AreEqual(target.TestData, to.TestData);
+ }
+
+ [Test]
+ public void CanSerializeDeserializeISerializable()
+ {
+ int instanceCount;
+ ISerializableTestObject target = new CustomSerializableTestObject();
+ target.TestData = "testData";
+ AdvisedSupport advised = new AdvisedSupport();
+ advised.Target = target;
+ advised.Interfaces = new Type[] { typeof(ISerializableTestObject) };
+ // advised.AddAdvisor(new DefaultPointcutAdvisor(new NopInterceptor()));
+
+ ISerializableTestObject to = (ISerializableTestObject)CreateAopProxy(advised);
+
+ instanceCount = CustomSerializableTestObject.InstanceCount;
+ to = (ISerializableTestObject)SerializeAndDeserialize(to);
+
+ // new instance was created
+ Assert.AreEqual(instanceCount + 1, CustomSerializableTestObject.InstanceCount);
+ // values were (de-)serialized
+ Assert.AreEqual(target.TestData, to.TestData);
+ }
+
+ #endregion
+
[Test(Description = "Simple test that if we set values we can get them out again.")]
public void ValuesStick()
{
diff --git a/test/Spring/Spring.Aop.Tests/Aop/Framework/DynamicProxy/CompositionAopProxyTests.cs b/test/Spring/Spring.Aop.Tests/Aop/Framework/DynamicProxy/CompositionAopProxyTests.cs
index abdb3fef..de17d2c9 100644
--- a/test/Spring/Spring.Aop.Tests/Aop/Framework/DynamicProxy/CompositionAopProxyTests.cs
+++ b/test/Spring/Spring.Aop.Tests/Aop/Framework/DynamicProxy/CompositionAopProxyTests.cs
@@ -21,7 +21,15 @@
#region Imports
using System;
+using System.Collections;
+using System.IO;
+using System.Reflection;
+using System.Runtime.Serialization;
+using System.Runtime.Serialization.Formatters;
+using System.Runtime.Serialization.Formatters.Binary;
using NUnit.Framework;
+using Spring.Aop.Interceptor;
+using Spring.Aop.Support;
using Spring.Objects;
#endregion