代码之家  ›  专栏  ›  技术社区  ›  Vinay B R

Silverlight程序集中定义的类型的二进制序列化

  •  0
  • Vinay B R  · 技术社区  · 14 年前

    4 回复  |  直到 13 年前
        1
  •  1
  •   Igor V Savchenko    14 年前

    private static MemberInfo[] InternalGetSerializableMembers(RuntimeType type)
    

     if (!CheckSerializable(type))
        {
            throw new SerializationException(Environment.GetResourceString("Serialization_NonSerType", new object[] { type.FullName, type.Module.Assembly.FullName }));
        }
    

    private static bool CheckSerializable(RuntimeType type)
    {
        return type.IsSerializable;
    }
    

        Type t = typeof (SomeClass);
        bool isTypeSerializable = t.IsSerializable;
    






    Silverlight程序集中的类:

    public class SomeClass
    {
        public int IntValue { get; set; }
        public string StringValue { get; set; }
        public bool BoolValue { get; set; }
    }
    

    代理类,它支持在公共.NET资产内部使用对Silverlight程序集的引用进行序列化:

        [Serializable]
        public class SomeClassProxy
        {
            public int IntValue { get; set; }
            public string StringValue { get; set; }
            public bool BoolValue { get; set; }
    
            public static SomeClassProxy GetSerializableObject(SomeClass silverlightClass)
            {
                return new SomeClassProxy
                        {
                            IntValue = silverlightClass.IntValue,
                            StringValue = silverlightClass.StringValue,
                            BoolValue = silverlightClass.BoolValue
                        };
            }
    
            public static SomeClass DeserializeSilverlightCompatible(Stream stream)
            {
                BinaryFormatter formatter = new BinaryFormatter();
                SomeClassProxy proxy = formatter.Deserialize(stream) as SomeClassProxy;
    
                return new SomeClass
                {
                    IntValue = proxy.IntValue,
                    StringValue = proxy.StringValue,
                    BoolValue = proxy.BoolValue
                };
            }
        }
    

    因此,在ASP.NET或WinForms应用程序中,应使用代理类进行操作:

        using(MemoryStream memoryStream = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();
                                //create instance of silverlight class
                SomeClass mySilverlightClass = new SomeClass();
                mySilverlightClass.IntValue = 555;
                mySilverlightClass.StringValue = "Hello World!";
                mySilverlightClass.BoolValue = true;
    
                //<===serialize and take care of silverlight instance
                formatter.Serialize(memoryStream, SomeClassProxy.GetSerializableObject(mySilverlightClass));
    
                memoryStream.Seek(0, SeekOrigin.Begin);
                //===>deserialize to silverlight instance
                SomeClass mySilverlightClassRestored =  SomeClassProxy.DeserializeSilverlightCompatible(memoryStream);
            }
    

    因此,此代理同时负责序列化和反序列化(反序列化之后,您将收到在Silverlight程序集中定义的类SomeClass的实例)。

    如果二进制格式化程序是软的重新计算,那么我建议您改用XML序列化程序:

    XmlSerializer s = new XmlSerializer(typeof(SomeClass));
    s.Serialize(memoryStream, mySilverlightClass);
    memoryStream.Seek(0, SeekOrigin.Begin);
    SomeClass restored = s.Deserialize(memoryStream) as SomeClass;
    

    如果不需要序列化属性。

        2
  •  0
  •   Mike Talbot    14 年前

    你可以试试我的序列化程序,它可以在.NET和Silverlight之间移动二进制数据… http://whydoidoit.com

        3
  •  0
  •   Vinay B R    14 年前

    我用了一种叫做 sharp serializer 它能够对没有可序列化属性的类型进行二进制序列化。

        4
  •  0
  •   Tim Cooper    13 年前

    你可以使用 #if 包含非Silverlight生成的序列化属性(和代码)的指令:

    #if !SILVERLIGHT
    [Serializable]
    #endif
    public class SomeClass
    {
    }