From 09395a3741e7fac72d1f83c5711e1335be20dbfd Mon Sep 17 00:00:00 2001 From: eeichinger Date: Tue, 3 Mar 2009 13:52:17 +0000 Subject: [PATCH] fixed SPRNET-1176 --- .../Aop/Framework/AdvisedSupport.cs | 2 +- .../Framework/DynamicProxy/AdvisedProxy.cs | 2 +- .../DynamicProxy/BaseCompositionAopProxy.cs | 8 ++ .../DynamicProxy/DefaultAopProxyFactory.cs | 14 +- .../DynamicProxy/AbstractAopProxyTests.cs | 134 +++++++++++++++++- .../DynamicProxy/CompositionAopProxyTests.cs | 8 ++ 6 files changed, 162 insertions(+), 6 deletions(-) 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