作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在 C# 中有一个包含 guid 的结构。我正在使用 DataContractJsonSerializer 序列化包含该类实例的对象。当我直接使用 guid 时,它被序列化为一个普通字符串,但现在它被序列化为一个名称/值对。下面是演示该问题的 NUnit 测试和支持代码:
private static string ToJson<T>(T data)
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof (T));
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, data);
return Encoding.Default.GetString(ms.ToArray());
}
}
[Serializable]
private class ID
{
private Guid _value;
public static explicit operator ID(Guid id)
{
return new ID { _value = id };
}
public static explicit operator Guid(ID id)
{
return id._value;
}
}
[Test]
public void IDShouldSerializeLikeGuid()
{
Guid guid = Guid.NewGuid();
ID id = (ID) guid;
Assert.That(ToJson(id), Is.EqualTo(ToJson(guid)));
}
测试运行器输出:
NUnit.Framework.AssertionException: Expected string length 38 but was 49. Strings differ at index 0.
Expected: ""7511fb9f-3515-4e95-9a04-06580753527d""
But was: "{"_value":"7511fb9f-3515-4e95-9a04-06580753527d"}"
-----------^
如何将我的结构序列化为纯字符串并通过测试?
最佳答案
在这种情况下,您似乎并不真正需要 JSON,您需要的是字符串表示形式。在那种情况下,我会创建一个这样的界面:
interface IStringSerialized
{
String GetString();
}
在您的 ID
类型(以及具有类似要求的所有其他类型)上实现此接口(interface)。
[Serializable]
class ID : IStringSerialized
{
private Guid _value;
public static explicit operator ID(Guid id)
{
return new ID { _value = id };
}
public static explicit operator Guid(ID id)
{
return id._value;
}
public string GetString()
{
return this._value.ToString();
}
}
然后修改您的序列化方法来处理这些特殊情况:
private static string ToJson<T>(T data)
{
IStringSerialized s = data as IStringSerialized;
if (s != null)
return s.GetString();
DataContractJsonSerializer serializer
= new DataContractJsonSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, data);
return Encoding.Default.GetString(ms.ToArray());
}
}
关于c# - 如何使 DataContractJsonSerializer 将对象序列化为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1178255/
出于好奇,我尝试了一些原型(prototype)制作,但似乎只允许在第一个位置使用子例程的原型(prototype) &。 当我写作时 sub test (&$$) { do_somethin
我需要开发一个类似于 Android Play 商店应用程序或类似 this app 的应用程序.我阅读了很多教程,发现几乎每个教程都有与 this one 类似的例子。 . 我已经开始使用我的应用程
考虑一个表示“事件之间的时间”的列: (5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2) 我想将这些分组到 30 个桶中,但桶会重置。期望的结果: (0, 1,
我是一名优秀的程序员,十分优秀!