返回首页

{A}目录表与sharpSerializer的Hello World不包括从序列化的属性自定义序列化的属性列表AssemblyQualifiedName或作为一个短期的类型名称quot;的序列化类型的TypeName,AssemblyNamequot;DateTime和浮点值的自定义格式数据序列化到其他格式为XML{A6}{A7}序列化一个多态的财产(该财产的价值是从属性的类型继承)值从接口继承序列化泛型Dictionary序列化的多维数组序列不同的对象类型的数组和数组的数组(嵌套数组) 序列化其他类型{A8}{A9}{A10}{A11}{A12}{A13} sharpSerializer
是一个开源的。NET Framework对象序列化器。NET精简框架和Silverlight。其目的很简单 - 快速的对象序列化,没有安全的考虑,从A到B。在这篇文章中,我会尽力说服你,sharpSerializer可以比很多内置的XmlSerializer和简单。{A14}
内置在XmlSerializer的对象序列化有一些限制:它不能序列化的多维数组。它不能序列化一个通用的Dictionarylt; TKEY,TValuegt。它不能序列化开箱多态性属性(从物业类型继承的值类型)。它需要在其序列(...)方法的序列化对象的类型。它需要很多的属性来定义你的业务对象,例如:XmlArrayAttribute,XmlArrayItemAttribute来定义的继承类型的数组。
sharpSerializer克服上述限制,而无需额外的属性,以纪念对象,并没有被序列化的类型序列化对象。{A15}与sharpSerializer的Hello World
假设我们有一个对象:

public class SomeObject

{

    public int SimpleInt { get; set; }

    public DateTime SimpleDateTime { get; set; }

    public TimeSpan SimpleTimeSpan { get; set; }

    public SimpleEnum SimpleEnum { get; set; }

    public string SimpleString { get; set; }

}



public enum SimpleEnum {One,Two,Three}

我们初始化和序列化这个对象:{C}
注意!您不需要标记您的任何属性的对象,也不必给Serialize方法的对象的类型。
这个对象序列化到下面的XML:
<Complex name="Root" type="SharpSerializerTestApp.SomeObject, SharpSerializerTestApp">

  <Properties>

    <Simple name="SimpleInt" value="42" />

    <Simple name="SimpleDateTime" value="04/28/2010 00:00:00" />

    <Simple name="SimpleTimeSpan" value="01:02:03" />

    <Simple name="SimpleEnum" value="Three" />

    <Simple name="SimpleString" value="nothing" />

  </Properties>

</Complex>

正如你可以看到,对象的类型是序列为quot;,AssemblyNamequot; TYPENAME和DateTime序列化CultureInfo.InvariantCulture。后来,我会告诉你如何自定义类型的名称(即,作为AssemblyQualifiedName)和如何保存你想要的格式DateTime和浮点数。不包括从序列化的属性
默认情况下,所有属性被序列化,这是公开的,例如,而不是只读。也序列化阵列(Type.IsArray == TRUE),或从IEnumerable,ICollection的或IDictionary的继承所有属性。出于性能方面的原因,不会被序列化领域。要排除在您的自定义类型的属性,你需要标记与属性。 ExcludeFromSerializationAttribute支持开箱。
public class MyClass

{

    [ExcludeFromSerialization]

    public int SimpleInt { get; set; }

}
如果你的对象是常见的。NET属性,如XmlIgnore标记,你可以将这些属性添加到上市AttributesToIgnore。
// remove default ExcludeFromSerializationAttribute for performance gain

serializer.PropertyProvider.AttributesToIgnore.Clear(); 

serializer.PropertyProvider.AttributesToIgnore.Add(typeof(XmlIgnore));

或使用设置类:
// for binary mode

var settings = new SharpSerializerBinarySettings();



// for xml mode

var settings = new SharpSerializerXmlSettings(); 

// remove default ExcludeFromSerializationAttribute for performance gain

settings.AdvancedSettings.AttributesToIgnore.Clear(); 

settings.AdvancedSettings.AttributesToIgnore.Add(typeof(XmlIgnore));
要排除内置。NET类型的属性,或者如果不能延长带属性的属性,你的类型和它的属性名添加到列表SharpSerializer.PropertyProvider.PropertiesToIgnore。

即System.Collections.Generic.Listlt; TGT;财产的能力,这是不相关的序列化,因此它应该被忽略。
serializer.PropertyProvider.PropertiesToIgnore.Add

	(typeof(List<string>), "Capacity");

PropertiesToIgnore也可以从sharpSerializer设置访问。
// create the settings

var settings = new SharpSerializerBinarySettings(); // for binary mode

var settings = new SharpSerializerXmlSettings(); // for xml mode

settings.AdvancedSettings.PropertiesToIgnore.Add(typeof(List), "Capacity");
自定义序列化属性列表
如果没有足够的过滤与属性ExcludeFromSerializationAttribute,AttributesToIgnore或PropertiesToIgnore,你可以建立CustomPropertyProvider。作为一个基类,有PropertyProvider,其中有两个虚方法GetAllProperties()和IgnoreProperty (...).它们可以覆盖到自定义的逻辑。
serializer.PropertyProvider = new MyCustomPropertyProvider();
AssemblyQualifiedName或作为一个短期的类型名称quot;的序列化类型的TypeName,AssemblyNamequot;
之前SharpSerializer v.2.12,所有类型的序列化类型的名称短quot;的TypeName,AssemblyNamequot;即:
type="System.String, mscorlib"

这是简单的阅读,输出的规模还很小。但是,反序列化过程中遇到的问题,如果签名的程序集或特定版本的工作。
自SharpSerializer v.2.12 AssemblyQualifiedName序列化的所有类型,即:
type="System.String, mscorlib, Version=2.0.0.0, 

      Culture=neutral, PublicKeyToken=b77a5c561934e089"

你可以改变改变sharpSerializer设置和设置的属性IncludeAssemblyVersionInTypeName,IncludeCultureInTypeName和IncludePublicKeyTokenInTypeName的类型命名。由于默认情况下,这些属性arenbsp;设置为true。
var settings = new SharpSerializerXmlSettings();



settings.IncludeAssemblyVersionInTypeName = false;

settings.IncludeCultureInTypeName = false;

settings.IncludePublicKeyTokenInTypeName = false;



var serializer = new SharpSerializer(settings);
DateTime和浮点值的自定义格式
默认情况下,所有的原始类型和日期转换为字符串根据CultureInfo.InvariantCulture。如果需要自定义格式或一种文化,这可以实现设置类的以下修改:
var settings = new SharpSerializerXmlSettings();

settings.Culture = System.Globalization.CultureInfo.CurrentCulture;

var serializer = new SharpSerializer(settings);
序列化数据到其他格式为XML
其实,sharpSerializer可以序列化到XML和自己的二进制格式。然而,注射后定制IXmlWriter或IBinaryWriter,它可以像JSON或其它加密,压缩,优化等二进制流其他文本格式序列化数据。请参考{A16}有关二进制序列化的详细信息。{A17}
这三个步骤:第1步
PropertyFactory转换属性的对象。抽象类属性包含PropertyCollection。 PropertyCollection代表对象的结构和它的数据。下面的类继承属性类:SimpleProperty用于描述所有的原始类型和字符串的DateTime,TimeSpan的所有枚举ComplexProperty为其他类和结构,这是不上市引用一个已经序列化的类ComplexReferenceProperty(节省空间。)SingleDimensionalArrayProperty为单维数组 MultiDimensionalArrayProperty为多维数组从ICollection继承,但不是从IDictionary的CollectionProperty为上市 从IDictionary的继承对上市DictionaryPropertyNullProperty所有对象/空字符串(有需要作出通知,他们都为空)第2步
属性是序列XmlPropertySerializer。其中,它是序列化的格式取决于所用的作家。第3步
XML序列化,DefaultXmlWriter负责。但作为一个接收器,可用于任何作家,实现IXmlWriter。这样,你可以写自己的作家,其中数据到其他格式如JSON序列化。
在反序列化过程中,这个过程是反向的。 IXmlReader的一个实例读取数据XmlPropertyDeserializer,反序列化属性的数据,并将其转发。最后的ObjectFactory转换成对象的属性。
请下载{A18}更多细节。{A19}
下面的例子是部分的HelloWorldDemo应用程序,你可以用{A18}下载。序列化一个多态的属性(属性类型属性的值是从继承)
是一个类型IComplexObject的属性。属性值包含一个类ComplexObject,它是从IComplexObject继承。
public IComplexObject ComplexObject { get; set; }

有没有需要被序列化的类型的输入。 sharpSerializer可以序列化的预期的类型和任何继承类型的开箱:
<Complex name="ComplexObject" 

     type="HalloWorldApp.BusinessObjects.ComplexObject, HalloWorldApp">

  <Properties>

    <Simple name="SimpleInt" value="33" />

  </Properties>

</Complex>
从接口继承值序列化泛型Dictionary
值从接口IComplexObject(多态参数)继承了一些复杂的类,这是一个通用的字典:
public IDictionary<int, IComplexObject> GenericDictionary { get; set; }

序列化:
<Dictionary name="GenericDictionaryOfPolymorphicValues" 



          type="System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib],

                   [HalloWorldApp.BusinessObjects.IComplexObject, HalloWorldApp]], 

                   mscorlib" keyType="System.Int32, mscorlib" 

          valueType="HalloWorldApp.BusinessObjects.IComplexObject, HalloWorldApp">

    <Items>

      <Item>



        <Simple value="2012" />

        <Complex type="HalloWorldApp.BusinessObjects.ComplexObject, HalloWorldApp">

          <Properties>

            <Simple name="SimpleInt" value="2012000" />

          </Properties>

        </Complex>

      </Item>

    </Items>

</Dictionary>

正如你可以看到,键和值的类型并不重要。 sharpSerializer可以序列化原始类型,复杂的对象,甚至嵌套列表,例如,字典。序列化一个多维数组
有一个二维数组(它可能有更多的维度):
public string[,] DoubleArray { get; set; }

序列化:
<MultiArray name="DoubleArray" elementType="System.String, mscorlib">

    <Dimensions>

      <Dimension length="3" />

      <Dimension length="2" />

    </Dimensions>

    <Items>

      <Item indexes="0,0">

        <Simple value="k1" />

      </Item>

      <Item indexes="0,1">

        <Simple value="k2" />

      </Item>

      <Item indexes="1,0">

        <Simple value="b1" />

      </Item>

      <Item indexes="1,1">

        <Simple value="b2" />

      </Item>

      <Item indexes="2,0">

        <Simple value="z1" />

      </Item>

      <Item indexes="2,1">

        <Simple value="z2" />

      </Item>

    </Items>

</MultiArray>

不要紧数组是什么类型的。 sharpSerializer可以序列化任何对象的数组,数组的数组,数组的集合,数组或字典。它可以序列化真正深的嵌套数组。序列不同的对象类型的数组和数组的数组(嵌套数组)
有以下对象的数组:
root.SingleArrayOfObjects = new object[] 

{

    42, 

    "nothing to say", 

    false, 

    BusinessObjects.SimpleEnum.Three, 

    null, 

    new object[] 

           {

              42, 

              "nothing to say", 

              false, 

              BusinessObjects.SimpleEnum.Three, 

              null 

           } 

};

序列化:
<SingleArray name="SingleArrayOfObjects" elementType="System.Object, mscorlib">

    <Items>

      <Simple type="System.Int32, mscorlib" value="42" />

      <Simple type="System.String, mscorlib" value="nothing to say" />

      <Simple type="System.Boolean, mscorlib" value="False" />

      <Simple type="HalloWorldApp.BusinessObjects.SimpleEnum, 

		HalloWorldApp" value="Three" />

      <Null />

      <SingleArray type="System.Object[], mscorlib" 

		elementType="System.Object, mscorlib">

        <Items>

          <Simple type="System.Int32, mscorlib" value="42" />

          <Simple type="System.String, mscorlib" value="nothing to say" />

          <Simple type="System.Boolean, mscorlib" value="False" />

          <Simple type="HalloWorldApp.BusinessObjects.SimpleEnum, HalloWorldApp" 

        value="Three" />

          <Null />

        </Items>

      </SingleArray>

    </Items>

</SingleArray>
序列化其他类型
请下载{A18}看到整个的例子,还有什么可以被序列化。下面是从HelloWorldDemo其他一些属性:
public class RootContainer

{

    /// <summary>

    /// Structures are handled as objects during serialization

    /// They are serialized as ComplexProperty

    /// </summary>

    public AdvancedStruct AdvancedStruct { get; set; }



    /// <summary>

    /// Single dimensional array of simple type.

    /// It is serialized as SingleDimensionalArrayProperty

    /// </summary>

    public string[] SingleArray { get; set; }



    /// <summary>

    /// Multidimensional array of simple type.

    /// Is is serialized as MultiDimensionalArrayProperty

    /// </summary>

    public string[,] DoubleArray { get; set; }



    /// <summary>

    /// Single array of derived objects.

    /// This is polymorphic collection - Items derive from the interface

    /// </summary>

    public IComplexObject[] PolymorphicSingleArray { get; set; }



    /// <summary>

    /// Generic list is serialized as a collection.



    /// It is serialized as CollectionProperty

    /// </summary>

    public IList<string> GenericList { get; set; }



    /// <summary>

    /// Polymorphic property. Object instance derives from the property type

    /// Is serialized as ComplexProperty

    /// </summary>

    public IComplexObject ComplexObject { get; set; }



    /// <summary>

    /// Collection where item values are

    /// derived from the collection item type

    /// </summary>

    public ComplexObjectPolymorphicCollection ComplexObjectCollection

                { get; set; }



    /// <summary>

    /// Dictionary where values are derived

    /// from the predefined dictionary value type

    /// </summary>

    public ComplexObjectPolymorphicDictionary ComplexObjectDictionary 

                { get; set; }



    /// <summary>

    /// List items are derived from the generic attribute.

    /// This is polymorphic attribute.

    /// </summary>

    public IList<IComplexObject> GenericListOfComplexObjects { get; set; }



    /// <summary>

    /// Generic object with polymorphic attribute.

    /// It is serialized as ComplexProperty

    /// </summary>

    public GenericObject<IComplexObject> GenericObjectOfComplexObject

                { get; set; }



    /// <summary>

    /// Multidimensional array of generic object with polymorphic attribute

    /// </summary>

    public GenericObject<IComplexObject>[,] 

	MultiArrayOfGenericObjectWithPolymorphicArgument

                { get; set; }

}



public interface IComplexObject { int SimpleInt { get; set; } }



public class ComplexObject : IComplexObject {public int SimpleInt

                { get; set; }}



public class ComplexObjectPolymorphicCollection :

                Collection<IComplexObject>{}



public class ComplexObjectCollection :

                Collection<ComplexObject>{}



public class ComplexObjectPolymorphicDictionary :

                Dictionary<int, IComplexObject>{}



public class ComplexObjectDictionary :

                Dictionary<int, ComplexObject>{}

你怎么想? sharpSerializer简单的XML序列化就够了吗?{A22}
在当前版本的sharpSerializer,也有一些限制有关对象的序列化和反序列化。在未来,这些限制可以被瓦解,但其实他们并没有这样的痛苦。它们是:没有他们的公共标准构造的对象不能被反序列化。多次引用到同一个复杂的对象是没有经过优化。这种多重引用对象序列化为它的许多引用多次。 (SharpSerializer v.2.9及以上可以优化序列的同一对象的多个引用,只有一次这样的对象序列化。较小的文件大小的优化结果。)
NET精简框架和Silverlight的限制后的序列化。在一个数组LowerBound将始终为0,不管它是如何序列化反序列化。
数组LowerBound是没有的。NET Framework精简或Silverlight的一部分,因此不能由sharpSerializer处理。{A23}
我开发sharpSerializer的主要原因是保存在一个XML文件的应用程序配置。几年前,我是一个多态配置与挣扎。我需要一个轻量级的配置存储支持对象的继承。该文件应该易于阅读和手动编辑。 System.Configuration有一个大的开销,是太僵硬。
第二个原因很简单 - Silverlight的本地数据存储库的贫困支持 - 它应该有一个更好的之一:-)。
尤其有趣的是其序列化数据在WP7的二进制格式(Windows Phone 7的)的可能性。{A24}
项目页上的最近期的来源和新闻:{A25}。{A26}
,如果你喜欢sharpSerializer或本文 - 请给它打分。如果没有,请以下;-)评论{A27}2011年11月9日:根据sharpSerializer v.2.16变化2011年10月24日:更新的下载文件2011-07-31:更新的下载文件SharpSerializer v.2.122011年7月28日:更新的下载文件sharpSerializer v.2.112011年5月8日:根据sharpSerializer v.2.9的变化,GUID序列化,AttributesToIgnore和优化序列化多个引用同一个对象2010-10-07:更新的下载文件2010-10-03:根据sharpSerializer 2.0版的变化2010-05-05:根据sharpSerializer V.1.2变化2010-05-04:增加了。NET Compact Framework的支持2010-04-30:格式更改(切断一些大的XML示例部分)2010-04-29:首先释放

回答

评论会员:raananv 时间:2012/01/26
大文章
评论会员:!!吉姆雷希 时间:2012/01/26
良好的工作,我的5
评论会员:!CIDev 时间:2012/01/26
。写得很好,有用的文章
仅仅因为代码的工作,但这并不意味着它是良好的代码
:帕维尔idzikowski
评论会员:游客 时间:2012/01/26
我试图序列化复杂类型,与接口属性名,仿制药,和一些抽象,与XmlSerializer,它是硬的,丑陋的,和马车,随着sharpSerializer简单,优雅!感谢
!BillWoodruff
评论会员:游客 时间:2012/01/26
非常感谢!如果你喜欢,请率[{A28}
MAD_Den
评论会员:游客 时间:2012/01/26
!优秀感谢分享。{S0}
帕维尔idzikowski
评论会员:游客 时间:2012/01/26
感谢!我给你留下一些CodePlex上的反馈。最好的是,条例草案"在河美食,恐慌并没有让我失望。"博尔赫斯:|CheloXL
特别THX​​为:
多次引用到同一个复杂的对象进行了优化
评论会员:帕维尔idzikowski 时间:2012/01/26
伟大的工作
评论会员:!!米哈尔斯特赫利克 时间:2012/01/26
令人印象深刻的工作。
是否有比较基准(序列化和反序列化的速度)
评论会员:?帕维尔idzikowski 时间:2012/01/26
感谢!性能取决于环境和被序列化的数据。有另一篇文章,比较BinaryFormatter的SharpSerializer 2.6:{A29}
评论会员:HoyaSaxa93 时间:2012/01/26
嗨,
我知道为什么GUID不序列化,因为它不具有公共属性。对于这些用例,这将是很好能够添加一个解析器解析器可以有一个方法返回一个对象的值,我需要序列化和另一种采用添加的形式(类型的类型,IResolver解析器)该对象,并返回正确反序列化的类型
评论会员:。帕维尔idzikowski 时间:2012/01/26
您好,SharpSerializer 2.8及以上的可序列化的Guid。最新版本和来源,你发现
评论会员:cockiest 时间:2012/01/26
能否请您附上一些图表,你比较速度和内存使用此XML序列化和本地
评论会员:帕维尔idzikowski 时间:2012/01/26
像{A30}
标题说:"一个多维数组的XML序列化(...)"我还没有建的。NET XmlSerializer的和sharpSerializer之间的速度比较,因为不能序列化的第一个这种类型的所有。

有一个{A31} BinaryFormatter和sharpSerializer之间的速度比较]。难道你的兴趣呢?简单对象XmlSerializer和sharpSerializer反正我会让速度比较。或者您也许可以帮助我,和你的结果后一篇文章
评论会员:cockiest 时间:2012/01/26
做得好
评论会员:帕维尔idzikowski 时间:2012/01/26
我需要5
评论会员:scosta_FST 时间:2012/01/26
听起来不错。它是如何比较nserializer?它也支持私有变量的循环引用序列化
评论会员:?帕维尔idzikowski 时间:2012/01/26
您好,有不支持私人领域和循环引用是不是在XML序列化进行了优化。当我在写SharpSerializer我有两个主要目的:
1)坚持我的配置类,并没有私人领域,发送简单的消息,不用扩展构造等 2)XML代码可读,因而不存在循环引用的优化。
的可能性,自定义1点,像常见问题SharpSerializer:

它是不够的,过滤与ExcludeFromSerializationAttribute属性或PropertiesToIgnore,你可以建立你的CustomPropertyProvider。作为一个基类有PropertyProvider,其中有两个虚方法GetAllProperties()和IgnoreProperty (...).他们可以覆盖到自定义的逻辑。

新MyCustomPropertyProvider serializer.PropertyProvider =()
有自定义属性的作家,需要解决的第2点。它可以从PropertyWriter它实现了接口IPropertyWriter的继承。 HIER,你可以把缓存逻辑。如果相同的对象将被检测到,将会有只有一个实例保存和X引用。

优化XML代码中的循环引用,没有任何意义,我认为,XML自我是不是最佳的方式来存储数据。
感谢您的sharpserializer兴趣{S0}
评论会员:scosta_FST 时间:2012/01/26
感谢您的回复
。我刚才试图序列化一个子类,但缺少的属性信息是。例如:
公共抽象类A
{
公众(){}{ BR} 公共抽象INT Prop1 {;}
}

B类:
{
私人INT prop1 = 1;
市民乙(){}{ BR} 公共覆盖Prop1 {prop1;}
}

一个OBJ =新的B()
新SharpSerializer SharpSerializer小号=
s.Serialize("C:\ abc.xml",OBJ)

它执行没有错误,但我无法找到的Prop1在XML文件的标记。
这是这个工具的限制呢?8月26日,2010 7:16上午
修改
评论会员:Paul89 时间:2012/01/26
您好,抽象属性?要告诉真相 - 从来没有听说过他们,也没有想念他们... ... {S0}
如果代码编译 - 他们必须是合法的...
它是可能的,sharpSerializer他们也没有看到。我的解决办法如下:
公共抽象类A
{
公共抽象INT Prop1 {{返回getProp1 ();}{ BR}内部抽象诠释getProp1()
}

B类:
{
私人INT prop1 = 1;

内部覆盖INT getProp1(1)
}