public void OverrideCSLAConstructor() { // TODO : Discuss - Only being used by Clone // WCF always uses NetDataContractAttribute var fields = typeof(Csla.Reflection.MethodCaller) .GetFields(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic) .Where(x => x.Name == @"_ctorCache").Single(); var dict = (Dictionary <Type, DynamicCtorDelegate>)fields.GetValue(null); ConstructorInfo info = typeof(Csla.Serialization.BinaryFormatterWrapper) .GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null); Func <BinaryFormatterWrapper> func = () => { var f = new BinaryFormatterWrapper(); f.Formatter.Context = new StreamingContext(StreamingContextStates.All, @"Keith"); return(f); }; MethodCallExpression method = Expression.Call(Expression.Constant(func.Target), func.Method); var exp = Expression.Lambda <DynamicCtorDelegate>(method).Compile(); dict[typeof(BinaryFormatterWrapper)] = exp; var formatter = Csla.Serialization.SerializationFormatterFactory.GetFormatter(); }
public void TestSerializableEventsActionSucceeds() { var root = new OverrideSerializationRoot(); var nonSerClass = new NonSerializedClass(); Action<object, PropertyChangedEventArgs> h = (sender, eventArgs) => { nonSerClass.Do(); }; var method = typeof (Action<object, PropertyChangedEventArgs>).GetMethod("Invoke"); var delgate = (PropertyChangedEventHandler)(object)method.CreateDelegate(typeof (PropertyChangedEventHandler), h); root.PropertyChanged += delgate; Action<object, PropertyChangingEventArgs> h1 = (sender, eventArgs) => { nonSerClass.Do(); }; var method1 = typeof(Action<object, PropertyChangingEventArgs>).GetMethod("Invoke"); var delgate1 = (PropertyChangingEventHandler)(object)method1.CreateDelegate(typeof(PropertyChangingEventHandler), h1); root.PropertyChanging += delgate1; var b = new BinaryFormatterWrapper(); b.Serialize(new MemoryStream(), root); }
public void TestSerializableEventsActionFails() { var root = new SerializationRoot(); var nonSerClass = new NonSerializedClass(); Action<object, PropertyChangedEventArgs> h = (sender, eventArgs) => { nonSerClass.Do(); }; var method = typeof (Action<object, PropertyChangedEventArgs>).GetMethod("Invoke"); var delgate = (PropertyChangedEventHandler)(object)method.CreateDelegate(typeof (PropertyChangedEventHandler), h); root.PropertyChanged += delgate; var b = new BinaryFormatterWrapper(); try { b.Serialize(new MemoryStream(), root); Assert.Fail("Serialization should have thrown an exception"); } catch (System.Runtime.Serialization.SerializationException) { // serialization failed as expected } }
public object Deserialize(Stream serializationStream) { try { var result = new MobileFormatter().Deserialize(serializationStream); var sysValue = result as SysState; if (sysValue != null) { var sysType = Type.GetType(sysValue.TypeName); result = TypeHelper.CoerceValue(sysType, sysValue.Value); } return result; } catch //(SerializationException) { //序列化失败,说明不能反序列化为 IMobile,接着尝试使用 Binary } var result2 = new BinaryFormatterWrapper().Deserialize(serializationStream); return result2; }