返回首页

。我会尽我所能保持CodePlex上的这篇文章,源代码在sync.Introductionnbsp;
这是最小,最快的多态性JSON序列化,最小的,因为它只有25KB,编译时,最快的,因为大部分时间它(见性能测试部分)和多态,因为它可以在运行时序列化和反序列化以下情况正确,什么都反对你扔它:

class animal { public string Name { get; set;} }

class cat: animal { public int legs { get; set;} }

class dog : animal { public bool tail { get; set;} }

class zoo { public List<animal> animals { get; set;} }



var zoo1 = new zoo();



zoo1.animals = new List<animal>();

zoo1.animals.Add(new cat());

zoo1.animals.Add(new dog());


这是一个很重要的一点,因为它简化了您的编码极大,是一个面向对象编程的基石,奇怪的几个序列化器处理这种情况下,甚至the​​nbsp。NETnbsp XmlSerializer的;不这样做,你有跳铁圈得到它的工作。此外,这是必须的,如果你要替换的BinaryFormatter的序列化其中大多数传输协议的应用中使用的,可以处理任何。NET对象结构(见我的WCF杀手文章)。什么和为什么的JSON
JSON(Java脚本对象符号)是一个文本或1999年左右人类可读的格式,由Douglas Crockford发明,主要是作为一个Web应用程序的数据交换格式(见{A})使用JSON作为内部存储格式。这implementationJust 3类2佣工的特点:$ typequot; codeJSON符合标准的1158线以下补充quot是用来表示对象的类型信息[Json.NET以及"schemaquot;是用来表示。 DataSet的架构信息"$ mapquot;用于处理后的运行时类型时,分配对象type.quot; $ typesquot;全局类型定义中使用的实例参考这本词典通过一个号码(类型减少JSON的大小NET 2.0中大量的嵌入式类型)工程,在下面的替代品清单一些实现至少需要NET 3.5Extremely小大小:25KB时compiledBlazingly快(见性能测试部分)可以动态创建typesHandles的GUID,数据集,词典,Hashtable和泛型列表的处理可空类型的处理字节数组为base64字符串处理objectsnbsp多态性集合;主题safenbsp; 处理值类型的数组(例如int []的char []等)处理泛型列表的值类型(如Listlt; intgt等) 处理的特殊情况Listlt;对象[] GT(批量数据传输的有用)处理嵌入式类(如Sales.Customer)处理多态对象类型的反序列化到原始类型(如对象ReturnEntity = GUID,数据集,ValueType的新的对象[] {object1,Object2的})[有线通信] NBSP需要;为JSON的较真序列化时,能够禁用扩展(如没有类型,输出地图) 能够反序列化标准JSON成一个类型,你给解串器,保证没有多态性。特殊情况进行了优化Dictionarylt输出字符串,stringgt;覆盖空值outputs.nbsp; properties.Datatable支持手柄XmlIgnore属性。通过IndentOutput property.nbsp齿痕JSON输出为Silverlight 4.0 NBSP支持; RegisterCustomType(用户)定义和非标准没有内置fastJSON(喜欢的TimeSpan,点等)的类型,必须通过此功能启用。 CUSTOMTYPE编译器指令,大约有1%的性能hit.You供应公共字段delegates.Added支持的串行器及解串器例程。如果日期结束quot;添加ShowReadOnlyProperties ReadOnly属性(默认为false =不会被输出)来控制输出自动UTC日期时间转换。Zquot;(JSON标准的)添加UseUTCDateTime属性来控制输出的UTC datetimes.Dictionarylt;字符串,GT;现在存储最佳千伏format.nbsp; Limitationsnbsp;目前无法反序列化值类型数组属性(例如int []的char []等)目前还不能处理多维数组。的Silverlight 4.0支持缺乏Hashtable时,数据集,数据表,因为它是不出来
在本节中我将讨论一些,我曾亲自使用的JSON替代品runtime.What的一部分。虽然我不能说这是一个全面的列表,但它展示了什么了there.XML
是最好的,如果你使用的是XML,那么就不要。它的速度太慢,臃肿,不值得作为第一件事,每个人都使用一个荣誉奖,但严重不。在此列表中的最慢的JSON慢的50倍以上。好处是,你可以从JSON easily.BinaryFormatter
可能最强大的格式转换为计算机到计算机的数据传输。它有一个相当不错的表现虽然有些实现在这里击败它。优点缺点可以处理任何一个Serializable属性itPretty紧凑输出版本不友好的:必须反序列化的确切类是序列化,因为版本problemNot人类readableNot以外的同一平台上的沟通(如双方必须。NET)Json.NET
没有良好的数据存储最引用的JSON序列化程序。NET框架是从()Json.NET。这是我在我自己的应用程序使用的第一个JSON的实施。优点缺点强大的输出,它可以处理datasetsFirst实施,我看到了它可以处理多态对象集合大型DLL的大小〜320kbSlow比较在listSource代码的其余部分是难以遵循,因为它是大LitJSON
我看周围很多寻找这种宝石(),这是0.5版以来2007。这是什么我是用我自己的实现之前,它取代了以前的的JSON序列化是Json.NET。诚然,我不得不改变了原来以适应上述要求。优点缺点可以做,Json.NET(我的变化后)。小型DLL的大小〜57KB较快没有处理原始的源代码(我写的事后我自己在自己的应用程序)的数据集的词法分析器类是很难followRequires NET 3.5(解决此限制了通过实施一个Linqbridge类与。NET 2.0)ServiceStack (
序列化一个令人惊讶的快速JSON杰米斯贝洛特串行器。串行速度是惊人的,虽然它不支持的序列化的需要是什么。我已经包括在这里作为衡量性能的标准。赞成 缺点 令人惊讶的快速serializerPretty小DLL的大小〜91KB 关于数据集的Nullable typesFails无法处理多态对象collectionsRequires至少NET 3.5Fails失败其他quot; exoticquot;像字典类型,哈希表等微软JSON Serializernbsp;(V1.7更新)流行的需求
我以前的无知有关Microsoft JSON实施和感谢大家谁给我指出了这一点,我有这个here.Pros frameworkCan中包含的缺点基本多态性objectsCan't序列化反序列化多态对象数据集失败,失败对其他quot; exoticquot;像字典类型,哈希表等4倍的速度较慢,在使用代码
使用代码序列化fastJSON执行以下操作:
// to serialize an object to string

string jsonText = fastJSON.JSON.Instance.ToJSON(c);



// to deserialize a string to an object

var newobj = fastJSON.JSON.Instance.ToObject(jsonText);

的主类是JSON,这是作为一个单身的实施,因此它可以缓存speed.nbsp信息的类型和财产; v1.7.5
// you can set the defaults for the Instance which will be used for all calls

JSON.Instance.UseOptimizedDatasetSchema = true; // you can control the serializer dataset schema

JSON.Instance.UseFastGuid = true;               // enable disable fast GUID serialization

JSON.Instance.UseSerializerExtension = true;    // enable disable the $type and $map inn the output



// you can do the same as the above on a per call basis

public string ToJSON(object obj, bool enableSerializerExtensions)

public string ToJSON(object obj, bool enableSerializerExtensions, bool enableFastGuid)

public string ToJSON(object obj, bool enableSerializerExtensions, bool enableFastGuid, bool enableOptimizedDatasetSchema)



// Parse will give you a Dictionary<string,object> with ArrayList representation of the JSON input

public object Parse(string json)



// if you have disabled extensions or are getting JSON from other sources then you must specify

// the deserialization type in one of the following ways

public T ToObject<T>(string json)

public object ToObject(string json, Type type)
添置添置v1.7.6
JSON.Instance.SerializeNullValues = true;    // enable disable null values to output



public string ToJSON(object obj, bool enableSerializerExtensions, bool enableFastGuid, bool enableOptimizedDatasetSchema, bool serializeNulls)

 
添置V1.8
对于所有这些要求为什么会出现不支持类型quot; Xquot;,我已经实现了一个开放的封闭的主体延伸到fastJSON这可以让你实现你自己的例程不支持无类型通过代码
为了让这个扩展,你必须编译与CUSTOMTYPE编译器指令是一个性能命中与它相关的
public void main()

{

     fastJSON.JSON.Instance.RegisterCustomType(typeof(TimeSpan), tsser, tsdes);

     // do some work as normal

}



private static string tsser(object data)

{

     return ((TimeSpan)data).Ticks.ToString();

}



private static object tsdes(string data)

{

     return new TimeSpan(long.Parse(data))

}

性能Testsnbsp;
下面的计算机上运行所有测试:AMD K625 1.5销售下进行3 GHz的Processor4Gb拉姆DDR2Windows 7家庭高级64bitWindows的3.9
测试评价是不同的。NET编译versions.NET 3.5。NET 4处理器类型设置为x86
处理器类型自动NET 4。 Excel中的屏幕截图以下是这些测试的结果与下面的说明:这些数字是经过时间(毫秒)。越红的背景越慢timesThe更多的绿色背景越快times.5测试每个serializer.The quot; AVGquot列最后4排除在第一次测试测试,这基本上是序列化设置的平均了其内部的缓存结构,时代处于关闭状态。 "; minquot;行的最低数量分别列在下面。 Json.NET串行器进行了测试,3.5r6和4.0r1的两个版本,这是当前one.quot; binquot; BinaryFormatter的测试reference.The测试结构是下面的代码,这是一种内在的5次循环1000 objects.Some数据类型的处理,从测试数据结构,使所有的序列化可以work.The测试代码模板
以下是基本的测试代码模板,你可以看到它是一个什么样的5测试循环我们要测试每个做的计数时间(1000次)。所用时间是写入到控制台选项卡格式化,所以你可以管到一个文件在Excel电子表格,以方便观看。
int count = 1000;

private static void fastjson_serialize()

{

	Console.WriteLine();

	Console.Write("fastjson serialize");

	for (int tests = 0; tests < 5; tests++)

	{

		DateTime st = DateTime.Now;

		colclass c;

		string jsonText = null;

		c = CreateObject();

		for (int i = 0; i < count; i++)

		{

			jsonText = fastJSON.JSON.Instance.ToJSON(c);

		}

		Console.Write("\t" + DateTime.Now.Subtract(st).TotalMilliseconds + "\t");

	}

}
测试数据结构
测试数据显示多态的性质,我们要测试下面的类。 quot; colclassquot;这些数据结构的集合。在附带的源文件,如哈希表,字典,数据集等更多的外来数据结构。
[Serializable()]

public class baseclass

{

    public string Name { get; set; }

    public string Code { get; set; }

}



[Serializable()]

public class class1 : baseclass

{

    public Guid guid { get; set; }

}



[Serializable()]

public class class2 : baseclass

{

    public string description { get; set; }

}



[Serializable()]

public class colclass

{

    public colclass()

    {

        items = new

List<baseclass>();

        date = DateTime.Now;

        multilineString = @"

        AJKLjaskljLA

   ahjksjkAHJKS

   AJKHSKJhaksjhAHSJKa

   AJKSHajkhsjkHKSJKash

   ASJKhasjkKASJKahsjk

        ";

        gggg = Guid.NewGuid();

        //hash = new Hashtable();

        isNew = true;

        done= true;

    }

    public bool done { get; set; }

    public DateTime date {get; set;}

    //public DataSet ds { get; set; }

    public string multilineString { get; set; }

    public List<baseclass> items { get; set; }

    public Guid gggg {get; set;}

    public decimal? dec {get; set;}

    public bool isNew { get; set; }

    //public Hashtable hash { get; set; }



}
。NET 3.5中序列
{S0} fastJSON是在这个测试中的第二位,比Stacks.fastJSON慢了近35%的保证金近2.9倍速度比二进制formatter.Json.NET的近1.9倍,是在新版本4.0r1对以前版本的慢3.5r6Json.NET v3.5r6是比二进制格式化快了近20%。 NET 3.5的Deserialize
fastJSON是在本次测试的首位,以10%的保证金堆。fastJSON是近4倍的速度比最接近的其他的JSON。 Json.NET近1.5倍的速度比其以前的版本3.5r6版本4.0r1 NET 4自动序列
{S2} fastJSON对Stacks.fastJSON近20%的保证金在本次测试的第一名,比二进制formatter.Json.NET v3.5r6二进制格式化看齐快近4.9x。 NET 4自动反序列化{S3} fastJSON首先是由11%的保证金。fastJSON比二进制formatter.Json.NET V4 1.5倍的速度比其以前的版本快1.7倍。 NET 4的x86序列{S4} fastJSON是对Stacks.fastJSON近21%的保证金在本次测试的第一名是4倍的速度比二进制formatter.Json.NET v3.5r6 1.7倍,比previuos版本更快.. NET 4中的x86的Deserialize{五} fastJSON是首位对Stacks.fastJSON 5%的保证金是1.7倍比二进制格式化这是third.Exotic数据型式试验
在本节我们将看到异国情调的数据类型,如数据集的性能测试结果快哈希表,字典等。 fastJSON和BinaryFormatter的,因为大多数其他序列化无法处理这些数据类型之间的比较。这些措施包括以下内容:DatasetsNullable类型HashtablesDictionaries
{中六} fastJSON是5倍的速度比在serializationfastJSON BinaryFormatter的20%以上deserializationDatasets BinaryFormatter的快了10 NBSP倍的性能杀手;性能ConclusionsfastJSON是在所有的测试速度更快,除非当下运行。NET 3.5中的堆栈速度只有35%(必须注意,堆栈不是多态的,不能处理所有类型的,所以它不是输出内部测试数据正确).. NET 4中的序列化速度更快比约15%在这些测试的。NET 3.5除fastJSON串行器快90%..您可以用fastJSON BinaryFormatter的一个巨大的性能提升(这个精益方式借给其自我压缩技术对文本输出也)。启动fastJSON成本平均2倍的速度比栈,速度始终高于人人else.nbsp; 性能结论V1.4
{七}
正如你可以看到从上面的图片V1.4 noticably快。即使在所有测试的速度提高fastJSON更快比SerializerStack,净v3.5.fastJSON串行器是比二进制一个dataset.nbsp更快的6.7x; fastJSON解串器是比二进制dataset.fastJSON串行器与快2.1倍,是6.9x比二进制快没有dataset.fastJSON解串器是1.6倍的速度比二进制无dataset.Performance结论V1.5
数字说话为自己fastJSON串行器6.65x没有DataSet和6.88x更快的速度比二进制,解串器是比二进制快2.7倍。在数量上的差异,这是比V1.4慢是在V1.5,V1.6
GUID快2倍,现在你可以恢复的base64编码,因为在枚举etc.Performance结论测试的额外的属性与UseFastGuid =虚假的JSON.InstanceDatasets旧式〜40%〜35%faster.fastJSON的序列化现在比解串器更快〜2.3倍的限制似乎2x.Performance结论V1.7
的int,long分析4X更快。 Unicode字符串优化,阅读和写作的非英文字符串faster.ChangeType方法optimizednbsp;词典optimizednbsp;使用Interestnbsp TryGetValuePoints;
我做了很多的性能调整与探查,这里是我的结果:始终使用StringBuilder,从未字符串邻接。切勿stringbuilder.append("string1的quot; string2quot),因为它杀死性能,取代两个StringBuilder的追加。这一点,吹我的脑海,在我的测试与profiler.Never,50%的速度给StringBuilder的一种能力的价值开始如VAR的StringBuilder =新的StringBuilder(4096);奇怪,但它是没有it.I试图取代一个MemoryStream的StringBuiler更快,但速度太慢(慢100%)。 最简单和最直接的方式可能是最快的,以及在反对词法分析器implementations.Always objects.HistoryInitial推出使用高速缓存的反射特性的点读值的情况下:二○一一年二月二十零日 更新V1.1 :26%的数据集反序列化的性能提升,纠正ServiceStack nameUpdate V1.2:System.DBNull序列化空,对数字的CultureInfo修复,ReadOnly属性,正确处理更新V1.3:移除未使用的代码(现在在780线),物业逗号fixUpdate V1.4:重优化(串行器3%,deserializernbsp;快50%,46%的速度更快的数据集序列化器,数据集的解串器快26%)[现在正式速度比即使在测试中所有的序列化程序ServiceStack NET 3.5。]更新V1。 5:重优化(解串器〜50%,比V1.4快),枚举修复,最大串行器Depth属性。西蒙休伊特特别感谢和学分在这个version.nbsp优化;更新V1.6:值类型数组handlednbsp; GUID快2倍的数据集〜40%的序列化器〜2%至11%,更快的解串器 6%至38%,更快的更新V1.7:增加了对微软测试新的异国情调typesbug修复字典deserializespecial情况下JSON evaluationadded consoletest项目下载处理Listlt;对象[] GT; 4X fasterunicode字符串int和长解析optimizechangetype optimizedictionary优化反序列化嵌入式类如Sales.Customer safedictionary检查处理前添加对象ReturnEntity =新对象[] {object1,Object2的处理对象ReturnEntity = GUID,数据集,valuetypeUpdate v1.7.5:没有extensionsoverloaded方法序列化序列化和deserializethe解串器的能力将竭尽所能来反序列化没有保证polymorphismnbsp带或不带扩展输入;更新v1.7.6:XmlIgnore处理:感谢帕特里克Oscarsson ideaspecial的情况下优化输出字符串字典,stringbug 0000 stringoverride修复今年1日期输出到输出序列空值:感谢再次PatrikUpdate v1.7.7:齿痕outputDatatable supportbug fixUpdate v1.7.7 Silverlight4:2011年6月4日当所有ok.Silverlight缺乏ArrayList中,数据集,DataTable中,Hashtable的支持,为silverlight4增加了一个新项目,目前在测试阶段,将新增主要邮编#如果silverlight4 support.nbsp源文件中的陈述;更新V1.8: 6月9日2011年合并为projectSeperate的Silverlight projectnbsp Silverlight代码; RegisterCustomType延长用户定义的序列化routinesCUSTOMTYPE编译directiveUpdate V1.9:2011年6月28日增加了市民支持fieldsUpdate v1.9.1:2011年6月30日固定一个可耻的错误,当SerializeNullValues​​ = FALSE,特别感谢格兰特testingnbsp Birchmeier v1.9.2更新:2011年7月10日固定,以全名而不是名称搜索时,在属性缓存类型(namespace1.myclass ,namespace2.myclass现在不同)alex211bUpdate v1.9.3:2011年7月31 UTC通过UseUTCDateTime的datetime处理= true属性,以感谢mrkappa添加字典感谢作为重点给予支持枚举BirchmeierUpdate v1.9.4:2011年九月二十三日ShowReadOnlyProperties出口ReadOnly属性(默认= FALSE)如果datetime值结束quot; Zquot,然后自动UTC时间计算,如果使用UTC日期时间输出端在quot; Zquot;(符合标准)更新v1.9.6:2011年11月26日bug修复DataTable的架构序列放大器; deserializeadded美元全局类型定义类型的扩展,减少的想法输出JSON感谢马克霸业的大小添加UsingGlobalTypes配置用于控制上述(默认= TRUE)错误修复的DataTable逗号阵列之间和表定义(少皮棉抱怨)字符串键的字典序列化优化(不千伏格式)

回答

评论会员:佩尔彭纳 时间:2012/01/27
谢谢你...干得好...我需要一个VB版本,所以我转换到VB.NET的一些代码...该代码可以发现问题跟踪fastjson.codeplex.com
评论会员:LHanyecz 时间:2012/01/27
我要使用此代码来反序列化一个对象数组,并作为书面它只是返回空

我尝试使用的代码是:

字符串jsonstring ="[{......} / / {.....}]";简洁的编辑
MyObjectType [] AR = fastJSON.JSON.Instance.ToObject(jsonstring)

空这个结果,因为中间形式的解析数据是一个ArrayList,但ToObject方法是期望的输入始终是一个对象不是一个数组。结果是"作为"铸造的字典,这会导致一个空要传递给ParseDictionary()。如果硬投我猜,它会抛出一个异常,而不是没有错误,但目前只是失败。我提出以下修改ToObject(字符串型)方法JSON.cs我使用的情况下工作。


   public object ToObject( string json, Type type )

   {

       object jsonobj = new JsonParser( json ).Decode();

 

       if( jsonobj == null )

       {

           return null;

       }

 

       if( type != null && type.IsArray )

       {

           // json array

           if( jsonobj is ArrayList )

           {

               return CreateArray( (ArrayList)jsonobj, type, type.GetElementType(), null );

           }

           else

           {

               throw new Exception( "Conversion to array type was requested but the JSON input was not parsed to an array" );

           }

       }

       else

       {

           // json object

           return ParseDictionary( (Dictionary<string, object>)jsonobj, null, type );

       }

   }

评论会员:吉姆Simmermon 时间:2012/01/27
fastJSON.JSON.Instance.ToObject("[\"测试\",\"字符串\"]")将返回null。

我调用这个不正确
评论会员:会员2630999 时间:2012/01/27
我有点到JSON,我在想,我应该采取什么步骤来开始解析的东西,看起来像:
{

	"POLINFO" : {

		"NM" : "RTN",

		"ID" : "",

		"HC" : null

	},

	"MIR" : null,

	"IG" : [{

			"T" : null,

			"F" : "a$",

			"S" : "a$"

			"TP" : "a$",

		}, {

			"T" : null,

			"F" : "a$",

			"S" : "a$"

			"TP" : "a$",

		}, {

			"T" : null,

			"F" : "a$",

			"S" : "a$"

			"TP" : "a$",

		}, {

			"T" : null,

			"F" : "a$",

			"S" : "a$"

			"TP" : "a$",

		}, {

			"T" : null,

			"F" : "a$",

			"S" : "a$"

			"TP" : "a$",

		}, {

			"T" : null,

			"F" : "a$",

			"S" : "a$"

			"TP" : "a$",

		}

	],

	"SI" : {

		"NST" : "1",

		"SST" : null

	},

	"ISO" : false,

	"A2C" : "",

	"A2CBT" : "",

	"CI" : {

		"CI" : "",

		"PN" : "",

		"PID" : "",

		"SOURCE" : ""

	},

}

什么都可以帮助。我创建了一个类,它模仿的数据项,这样我可以进入重载报价:fastJSON.JSON.Instance.ToObject(文档,typeof运算(JSONTEST))
但我想我需要一本字典定义与规定值仍然变量映射。我不知道该怎么做,虽然。感谢您的时间
评论会员:。迈赫迪吴拉姆 时间:2012/01/27
尝试使用Parse(字符串)的,相反,它会给你一本字典和数组构造的输入JSON字符串

您的输入似乎没有结构,因此,创建一个类,它可能是非常困难的。
其人,不是机器 - 查克耶格尔
如果一开始你没有成功...获得一个更好的公关
如果最终目标是死亡,那么我们就应该享受每一秒的旅程
评论会员:会员2630999 时间:2012/01/27
我说来惭愧,我完全错过了解析功能。迈赫迪吴拉姆,谢谢您的帮助。我能得到一本字典,足以然后向我提供我需要的数据
评论会员:。Anuja帕瓦尔多尔 时间:2012/01/27
迈赫迪吴拉姆
评论会员:游客 时间:2012/01/27
|感谢感谢分享imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif其人,不是机器-查克耶格尔如果一开始你没有成功...获得一个更好的公关如果最终目标是死亡,那么我们就应该享受每一秒的旅程
Alezy80
评论会员:游客 时间:2012/01/27
我有一个与反序列化的问题。我的代码是最后一个字符串抛出一个异常"找不到指数15令牌"。当使用此选项codeprelang="cs"JSON.Instance.UseSerializerExtension=spanclass="code-keyword"false/span;/pre/code一切工作正常。第二个问题:为什么你作为单身的序列化程序?在某些情况下,我想改变序列化选项(仅适用于一个特定的情况下),以便使JSONconstuctor公共将是巨大的
。迈赫迪吴拉姆
评论会员:游客 时间:2012/01/27
目前fastJSON将反序列化对象,正确的,不直的馆藏你的情况,如果你把你的字典中的一类作为属性,那么一切都将工作得很好。我会检查异常并尝试修复它。fastJSON是作为一个单身的实施,因为它需要缓存类型信息和getter和setter方法​​的性能,所以它已存储状态信息,也有某些重载的序列化您控制每一个呼叫过程中的某些方面的基础上,你可以添加自己的代码,如果你需要更多,我已经错过了。其人,不是机器-查克耶格尔如果一开始你没有成功...获得一个更好的公关如果最终目标是死亡,那么我们就应该享受每一秒的旅程
。cghersi81
评论会员:游客 时间:2012/01/27
嗨迈赫迪,我首次接近您的库。我有以下问题:codeprelang="c#"spanclass="code-keyword"abstract/spanspanclass="code-keyword"class/spanA{spanclass="code-keyword"string/spanMyProp{spanclass="code-keyword"get/span;spanclass="code-keyword"set/span;}}spanclass="code-keyword"class/spanAimpl:A{...}spanclass="code-keyword"class/spanProgram{spanclass="code-keyword"public/spanspanclass="code-keyword"void/spanmain(){Atemp=spanclass="code-keyword"new/spanAimpl();temp.MyProp=spanclass="code-string""/spanspanclass="code-string"mycontent"/span;Console.WriteLine(fastJSON.JSON.Instance.ToJSON(temp));}}/pre/code输出JSONAimpl类(像{"$类型"的东西:{"MyNameSpace.Aimpl,...":"1"},"$类型":"1","MyProp":"我的内容"}),但我需要有一个JSON引用A类(如{"$类型的东西":{"MyNameSpace.A,...":"1"},"$型":"1","MyProp":"我的内容"}),因为我需要这个JSON传递到客户端的Aimpl类不可用,但只有A类...有没有办法取得A类生成的JSON字符串参考?非常感谢您的支持,最重要的是为您的了不起的图书馆!最佳cghersi
迈赫迪吴拉姆
评论会员:游客 时间:2012/01/27
不幸的是,fastJSON是使用CLR提供的类型定义。因为一个是抽象的,那么你不能创建一个直接的一个实例,你必须inhierate你最好的选择是创建一个"实体"项目,为您所有的数据类型和参考,在您的其他项目。其人,不是机器-查克耶格尔如果一开始你没有成功...获得一个更好的公关如果最终目标是死亡,那么我们就应该享受每一秒的旅程
。dwclogic
评论会员:游客 时间:2012/01/27
我有一个类中有2个对象,调用它myDocument中。MyData的_sd只有一个字符串和布尔值的一堆,_history堆叠。起初我能够序列化和反序列化的对象,但是当我开始使用的_history对象,它失败了,在JSON.ParseDictionary行[二传手(O,oset);](字典d)。我想这是Stack对象,并把它改成一个字典,包含的关键和_sd对象的JSON版本字符串。字符串JSON=fastJSON.JSON.Instance.ToJSON(_sd);返回一个不完整的的JSON对象-"{\"$\":\"myDocument中MYDATA,MyProject中,版本=1.0.0.0,文化=中性公钥=NULL\",}"{BR}_sd仅仅是一个私人字符串和布尔值的对象,其中约30当它工作时,我注意到,正在生成的字符串似乎不留真实的部分值对的JSON格式,"标题":"大卫","版本":"v.1.0.4","日期":"2011年11月25日10时11分07秒没有关键值对用逗号分​​隔,因为我认为它的JSON规范表示。我计划在与其他C,JavaScript和对象C项目使用的JSON对象,我担心他们不会正确反序列化所有项目使用的是属性的get/集名称,而不是实际varible名称前:_applicationTitle是实际的类中的变量的名称,标题是属性的get/集名称
。迈赫迪吴拉姆: |只有公共财产和田地被序列化,所以私有成员不会在输出JSON

检查您的版本,逗号,当然在输出,如果你有问题后,你的类,您正在使用的代码。
其人,不是机器 - 查克耶格尔
如果一开始你没有成功...获得一个更好的公关
如果最终目标是死亡,那么我们就应该享受每一秒的旅程
评论会员:迈赫迪吴拉姆 时间:2012/01/27
您好!我大概知道你的序列化程序后使用我的元数据XML到JSON的变化。这简直太棒了!
一些测试后,我得到了你建议:我在我的类中使用了大量的多态性,因此,我需要经常使用的类型的符号序列化。然后,我已经有了一个,它的一个巨大的组成部分沿线的所有文件一次又一次重复一些句子类型/组装的文字,我认为有可能是一个简单的方式来压缩所有数据,在一个更​​有效的方式
我看到你已经使用了字典缓冲区的所有类型,无论是在序列化和解析... ...你是像在文件头保存字典和使用中的每个对象只有一个关键是什么?也很多类型使用相同的程序集,同一版本,同样的话,这个头也可以writed级联,很短。
我想修改自己的代码,但我敢肯定,你会做更好的... ...
这是你的代码!
感谢您的伟大的代码。
最好的问候,
马克霸业
评论会员:迈赫迪吴拉姆 时间:2012/01/27
?你能给我你的意思,例如
其人,不是机器 - 查克耶格尔
如果一开始你没有成功...获得一个更好的公关
如果最终目标是死亡,那么我们就应该享受每一秒的旅程
评论会员:。迈赫迪吴拉姆 时间:2012/01/27
让我解释一下好一点(对不起,我的英语是不是最好的... ...我知道)

假设我们这样的代码:
	public abstract class Animal

	{

		public string Name;

	}

	public class Mammal:Animal

	{

		public string Fair;

	}

	public class Bird:Animal

	{

		public string Feathers;

	}

	public class Zone

	{

		public string Name;

		public List<Animal> Animals = new List<Animal>();

	}

	public class Zoo

	{

		public List<Zone> Zones = new List<Zone>();

	}

	

	class Program

	{

		static void Main(string[] args)

		{

			Program x = new Program();

			x.MainProgram(args);

		}

		void MainProgram(string[] args)

		{

			Zoo MyZoo = new Zoo();

			Zone Zone1 = new Zone();

			Zone1.Name = "Zone1";

			MyZoo.Zones.Add(Zone1);

			Zone Zone2 = new Zone();

			Zone2.Name = "Zone2";

			MyZoo.Zones.Add(Zone2);

			Mammal Elephant=new Mammal();

			Elephant.Fair="None";

			Zone1.Animals.Add(Elephant);

			Zone2.Animals.Add(Elephant);

			Mammal Tiger = new Mammal();

			Tiger.Fair = "Short";

			Zone1.Animals.Add(Tiger);

			Bird Duck = new Bird();

			Duck.Feathers = "White";

			Zone1.Animals.Add(Duck);

			Mammal Human = new Mammal();

			Human.Fair = "Sometimes";

			Zone1.Animals.Add(Human);

			Bird Woodpecker = new Bird();

			Woodpecker.Feathers = "Multicolor";

			Zone1.Animals.Add(Woodpecker);

			string typedjson = JSON.Instance.ToJSON(MyZoo);

			string nontypedjson = JSON.Instance.ToJSON(MyZoo, false);

			Zoo CopyZoo = (Zoo)JSON.Instance.ToObject(typedjson);

			//Zoo Copy2Zoo = (Zoo)JSON.Instance.ToObject(nontypedjson, typeof(Zoo));	

			//Error: it try to create Animal instead of Mammal, etc.

			string partiallytypedjson = typedjson.Replace("\"$type\":\"Disposable.Zoo, Disposable, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0846a8ae2ffa7e58\",", "");

			partiallytypedjson = partiallytypedjson.Replace("\"$type\":\"Disposable.Zone, Disposable, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0846a8ae2ffa7e58\",","");

			Zoo Copy2Zoo = (Zoo)JSON.Instance.ToObject(partiallytypedjson, typeof(Zoo));

正如你可以看到,我构建了一个简单的多态类结构...当然,我需要序列化使用安全型符号(typedjson)或反序列化,将无法正常工作(nontypedjson)。但是序列化文本有很大的空间,用于安全型符号:
作者:{
"类型":"Disposable.Zoo,一次性使用,版本= 1.0.0.0,文化=中性公钥= 0846a8ae2ffa7e58",
"区域":[
 60;{
"类型":"Disposable.Zone,一次性使用,版本= 1.0.0.0,文化=中性公钥= 0846a8ae2ffa7e58",
"名":"Zone1",
 60;"动物":[
& #160; {
"类型":"Disposable.Mammal,一次性的,版本= 1.0.0.0,文化=中性公钥= 0846a8ae2ffa7e58",
  ; "公平":"无",
&# 160; "名称":空
  ; },
& #160; {
"类型":"Disposable.Mammal,一次性的,版本= 1.0.0.0,文化=中性公钥= 0846a8ae2ffa7e58",
  ; "公平":"短",
& #160; "名称":空
 0; },
{
  ; "类型":"Disposable.Bird,一次性使用,版本= 1.0.0.0,文化=中性公钥= 0846a8ae2ffa7e58",
"羽毛":"白",
 0; "名称":空
& #160; },
 60; {
&# 160; "类型":"Disposable.Mammal,一次性的,版本= 1.0.0.0,文化=中性公钥= 0846a8ae2ffa7e58",
"公平":"有时",
 60; "名称":空
},
&# 160; {
& #160; "类型":"Disposable.Bird,一次性使用,版本= 1.0.0.0,文化=中性公钥= 0846a8ae2ffa7e58",
 60; "羽毛":"多色",
  ; "名称":空
&# 160; }

},
& #160; {
"类型":"Disposable.Zone,一次性使用,版本= 1.0.0.0,文化=中性公钥= 0846a8ae2ffa7e58",
& #160; "名":"ZONE2",
& #160; "动物":[
  ; {
 0; "类型":"Disposable.Mammal,一次性的,版本= 1.0.0.0,文化=中性公钥= 0846a8ae2ffa7e58",
"公平":"无",
"名称":空
 60; }
& #160;
}

}
我想:
第一:并非所有的安全符号,其中许多类定义本身是固定的,只有多态类需要(partiallytypedjson)安全类型的
needad。
好了,另一个想法:为什么不序列化作为一个主要JSON头的安全类型?是这样的:
作者:{
& #160; "类型":[
{
 0; "$型":"Disposable.Mammal",
"安全":"Disposable.Mammal的,一次性的,版本= 1.0.0.0,文化=中性公钥= 0846a8ae2ffa7e58"
},
{
 60; "$型":"Disposable.Bird",
  ; "安全":"Disposable.Bird,一次性使用,版本= 1.0.0.0,文化=中性公钥= 0846a8ae2ffa7e58"
}
],
&# 160;"区域":[
{
"名":"Zone1",
"动物":[
 0; {
 60; "$型":"Disposable.Mammal",
&# 160; "公平":"无",
 0; "名称":空
& #160; },
 60; {
&# 160; "$型":"Disposable.Mammal",
& #160;"公平":"短",
&# 160; "名称":空
  ; },
& #160; {
"$型":"Disposable.Bird",
"羽毛":"白",
"名称":空
 60; },
  ; {
 0; "$型":"Disposable.Mammal",
"公平":"有时",
 0; "名称":空
& #160; },
 60; {
&# 160; "$型":"Disposable.Bird",
"羽毛":"多色",
& #160; "名称":空
 0; }
&# 160;
},
 60; {
"名":"ZONE2",
"动物":[
{
 0; "$型":"Disposable.Mammal",
 60; "公平":"无",
  ; "名称":空
}

}

}

甚至更好:
作者:{
 0; "元组件":[
{
"集结号":"一次性的,版本= 1.0.0.0,文化=中性公钥= 0846a8ae2ffa7e58",
"类型":"Disposable.Mammal,Disposable.Bird"
}
],
"区":[...{ BR}
也许这是不是一个standar的方式来定义,jsons ...但它会在这种情况下提高了很多文本的长度
我认为这将是非常容易实现你使用,无论是在序列化和反序列化SaveDictionaries ...
评论会员:迈赫迪吴拉姆 时间:2012/01/27
的,而边缘的情况下,可能会不适用每一个身体。 BR}其人,不是机器 - 查克耶格尔
如果一开始你没有成功...获得一个更好的公关
如果最终目标是死亡,那么,我们应该享受每一秒的旅程