在.NET 2.0(C#)中有没有像使用XmlSerializer那样以简单/可定制的人类可读格式(例如看起来像PXLS或JSON)序列化对象的方法? 另外我知道XML是人类可读的,我正在寻找一些冗余度较低的东西,这些东西可以作为用户输出到控制台的结果。以人类可读的文本格式序列化
回答
序列化JSON成在.NET中你做如下:
public static string ToJson(IEnumerable collection)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(collection.GetType());
string json;
using (MemoryStream m = new MemoryStream())
{
XmlDictionaryWriter writer = JsonReaderWriterFactory.CreateJsonWriter(m);
ser.WriteObject(m, collection);
writer.Flush();
json = Encoding.Default.GetString(m.ToArray());
}
return json;
}
的收藏项目需要有“DataContract”属性,并希望每个成员被序列化到JSON必须具有“ DataMember“属性。
这可能只适用于.NET 3.5。但有一个同样简单的版本为2.0藏汉...
.Net的内置序列化选项是Xml,Xml-Soap和二进制。既然你排除了xml,二进制文件绝对不是人类可读的,你必须自己推出。
当滚动您自己,您有几种选择:
- 添加实用程序或Extention方法的类,像AviewAnew建议
- 扩展System.Runtime.Serialization.Formatter /实施System.Runtime。 Serialization.Formatter
- 通过谷歌在线寻找一个通用组件,它可以做你想做的事。
请注意,第二项可以专门为您的特定类(它不必处理任何类,如果你不想要它)和后两项不相互排斥。
我在过去搜索过一个.Net JSON格式化程序,并且在那里肯定有多个选项。然而,我最终走向了另一个不同的方向。我对他们中的任何一个都不感到自信。也许别人可以提供更具体的建议。 JSON正在变得足够大,希望微软很快就能在框架中包含对它的“原生”支持。
我可以写我自己的HumanSerializer是反映被给了它该对象的类型 - 但这会耗费了太多的时间。我认为之前可能有人解决了这个问题 - 但谷歌没有找到他或她。 – Martin 2008-11-03 14:59:08
我发现了一个exaustive文档浏览:
这个有用的类(支持泛型)
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
public class JSONHelper
{
public static string Serialize<T>(T obj)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, obj);
string retVal = Encoding.Default.GetString(ms.ToArray());
ms.Dispose();
return retVal;
}
public static T Deserialize<T>(string json)
{
T obj = Activator.CreateInstance<T>();
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
obj = (T)serializer.ReadObject(ms);
ms.Close();
ms.Dispose();
return obj;
}
}
https://stackoverflow.com/a/38538454/6627992
您可以使用以下标准方法获取格式化的Json
JsonReaderWriterFactory。CreateJsonWriter(流流,编码编码,布尔ownsStream,布尔缩进,串indentChars)
只有设置“缩进==真”
尝试是这样的
public readonly DataContractJsonSerializerSettings Settings =
new DataContractJsonSerializerSettings
{ UseSimpleDictionaryFormat = true };
public void Keep<TValue>(TValue item, string path)
{
try
{
using (var stream = File.Open(path, FileMode.Create))
{
var currentCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
try
{
using (var writer = JsonReaderWriterFactory.CreateJsonWriter(
stream, Encoding.UTF8, true, true, " "))
{
var serializer = new DataContractJsonSerializer(type, Settings);
serializer.WriteObject(writer, item);
writer.Flush();
}
}
catch (Exception exception)
{
Debug.WriteLine(exception.ToString());
}
finally
{
Thread.CurrentThread.CurrentCulture = currentCulture;
}
}
}
catch (Exception exception)
{
Debug.WriteLine(exception.ToString());
}
}
支付您注意至行
var currentCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
....
Thread.CurrentThread.CurrentCulture = currentCulture;
您应该使用InvariantCulture以避免在具有不同区域设置的计算机上进行反序列化时出现异常。例如,无效格式为double或DateTime有时会导致它们。
对于反序列化
public TValue Revive<TValue>(string path, params object[] constructorArgs)
{
try
{
using (var stream = File.OpenRead(path))
{
var currentCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
try
{
var serializer = new DataContractJsonSerializer(type, Settings);
var item = (TValue) serializer.ReadObject(stream);
if (Equals(item, null)) throw new Exception();
return item;
}
catch (Exception exception)
{
Debug.WriteLine(exception.ToString());
return (TValue) Activator.CreateInstance(type, constructorArgs);
}
finally
{
Thread.CurrentThread.CurrentCulture = currentCulture;
}
}
}
catch
{
return (TValue) Activator.CreateInstance(typeof (TValue), constructorArgs);
}
}
谢谢!
将xsl应用到你的xml去掉你不想看到的东西?
像
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" indent="yes"/>
<xsl:template match="*">
<xsl:value-of select="name()" /><xsl:text>
</xsl:text>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="@*|text()|comment()|processing-instruction">
<xsl:value-of select="name()" />:<xsl:value-of select="." /><xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
- 1. 格式化日期为人类可读的格式
- 2. 转换忽略Unicode序列的人类可读的格式
- 3. Java反序列化Arrays.toString() - 人类可读的序列化 - 配置文件
- 4. 如何以文本人类可读格式生成snort日志文件?
- 5. 人类可读的日期格式
- 6. 与到NON人类可读的格式
- 7. 如何在人类可读的格式
- 8. 人类可读时间的格式? JavaScript
- 9. JSON人类可读的正确格式
- 10. 使电子表格以版本控制的人类可读格式保存
- 11. 格式化日期对象,以显示人类可读的日期
- 12. 如何将UTCTime/NominalDiffTime格式化为人类可读表示?
- 13. Tz的日期格式人类可读的格式
- 14. 我可以使用Python格式化列表中的文本吗?
- 15. 在PHP中,可能以“人类可读语言”序列化数组,然后反序列化它?
- 16. 是否所有MS Word文档都以XML可读格式进行序列化?
- 17. 打印arraylist到人类可读形式的文本文件
- 18. 只读(不可变)可序列化类
- 19. 写作空格分隔的文本是人类可读的Python
- 20. 本地化人类可读的文件大小
- 21. 阅读Java Servlets的格式化文本
- 22. 格式化日期时间为人类可读(例如消息应用程序)
- 23. Android:以人类可读格式显示剩余时间
- 24. 将字符串的文本文件格式化为可读
- 25. 一个简约人类可读的序列化格式解析器用于嵌入式系统
- 26. 反序列化:需要调试到屏幕,人类可读
- 27. 从对象到人类可读文本
- 28. 以人类可读的格式获取流上下文默认值
- 29. 如何以人类可读的方式打开Java .class文件?
- 30. 将zip文件时间戳转换为人类可读格式
几分钟前,通过使用[Json.NET](http://www.codeplex.com/Json),我发现JSON不是最好的方法,因为它不支持Enums。结果是一个不太人性化的数字。 – Martin 2008-11-03 15:10:34
Okej,实现一切都取决于你正在序列化..如果它只有一个类型与少数成员,为什么不重写“ToString”并返回一个字符串.Format任何格式,你想 – ullmark 2008-11-03 15:31:55