让我们假设我有这个对象:
[Serializable]
public class MyClass
{
public int Age { get; set; }
public int MyClassB { get; set; }
}
[Serializable]
public class MyClassB
{
public int RandomNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
XmlSerializer会像这样序列化对象:
<MyClass>
<Age>0</age>
<MyClassB>
<RandomNumber>4234</RandomNumber>
</MyClassB>
</MyClass>
Run Code Online (Sandbox Code Playgroud)
我怎样才能使该物业成为可空?IE:当它低于0时,没有序列化属性Age?
我尝试使用Nullable,但它将我的对象序列化为:
<MyClass>
<Age d5p1:nil="true" />
<MyClassB>
<RandomNumber>4234</RandomNumber>
</MyClassB>
</MyClass>
Run Code Online (Sandbox Code Playgroud)
通过阅读MSDN文档,我发现了这个:
您不能将IsNullable属性应用于键入为值类型的成员,因为值类型不能包含nullNothingnullptra null引用(在Visual Basic中为Nothing).此外,对于可空值类型,您不能将此属性设置为false.当这些类型为nullNothingnullptra null引用(在Visual Basic中为Nothing)时,它们将通过将xsi:nil设置为true来序列化.
来源:http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute.isnullable.aspx
我理解值类型不能设置为null.值类型始终设置为某个值.序列化不能根据它的当前值决定是否序列化它.
我尝试了属性,但它没有成功.我尝试创建一个agecontainer对象并使用属性操作它的序列化,但它没有成功.
我真正想要的是:
<MyClass>
<MyClassB>
<RandomNumber>4234</RandomNumber>
</MyClassB>
</MyClass>
Run Code Online (Sandbox Code Playgroud)
当属性Age低于0(零)时.
看起来你必须实现自定义序列化.
是的,那也是我的意思,但我想在没有它的情况下逃脱.
在应用程序中,对象要复杂得多,我不想自己处理序列化.
在我正在开发的项目中,我们需要一个可以包含一些未定义的JSON的DataContract.
DataMember是一些仅对客户端有意义的JSON.我们希望允许客户向我们发送我们不知道的json.
例:
public class Contract
{
[DataMember]
public int clientId;
[DataMember]
public string json;
}
Run Code Online (Sandbox Code Playgroud)
显然,有一个像这样定义的契约需要客户端像这样转义json:
{
"clientId":1,
"json": "{\"test\":\"json\"}"
}
Run Code Online (Sandbox Code Playgroud)
显然,这不是我们所需要的.客户端应该发送给我们的json应该如下所示:
{
"clientId":1,
"json": {"test":"json"}
}
Run Code Online (Sandbox Code Playgroud)
可能的解决方案:
有没有人可以解决这个问题?
编辑
该服务提供休息json资源.它使用webHttpBinding定义单个端点.操作定义如下(为简单起见,将其拆除):
[WebInvoke(Method = "POST", UriTemplate = "...", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
Stream Create(Contract c);
Run Code Online (Sandbox Code Playgroud)
此外,该服务使用以下属性进行装饰:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
Run Code Online (Sandbox Code Playgroud)
谢谢.JF
在我正在开发的项目中,我们开始使用Json.Net库.
但是,我发现json.net在字符串类型上是"松散的".
这是一个例子:
DTO课程
[JsonObject]
public class DTO
{
[JsonProperty]
public string type;
}
Run Code Online (Sandbox Code Playgroud)
反序列化
byte[] rawBody = GetBytes(@"{""type"":true}");
using (MemoryStream ms = new MemoryStream(rawBody))
{
using (StreamReader sr = new StreamReader(ms))
{
var serializer = new JsonSerializer();
return serializer.Deserialize(sr, typeof(DTO));
}
}
Run Code Online (Sandbox Code Playgroud)
这会将'type'属性反序列化为"True".但是,我希望它失败并抛出异常,因为类型不匹配.如果我在json中将true替换为1,它也会这样做.属性'type'值为"1".
问题:
有没有办法强制执行严格的序列化?
是否有其他类型的字符串具有隐式转换,就像我们在这里看到的那样?
谢谢.
JF
我正在尝试发现WinDbg工具来分析我们在生产服务器上的崩溃转储.
当我跑步时!analyze -v
,我得到:
0:000> !analyze -v
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************
GetPageUrlData failed, server returned HTTP status 404
URL requested: http://watson.microsoft.com/StageOne/w3wp_exe/7_0_6002_18005/49e03238/unknown/0_0_0_0/bbbbbbb4/80000003/00000000.htm?Retriage=1
FAULTING_IP:
+14935130
00000000`00000000 ?? ???
EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 0000000000000000
ExceptionCode: 80000003 (Break instruction exception)
ExceptionFlags: 00000000
NumberParameters: 0
FAULTING_THREAD: 00000000000029b0
DEFAULT_BUCKET_ID: WRONG_SYMBOLS
PROCESS_NAME: w3wp.exe
ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} Breakpoint A breakpoint has been reached.
EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - One or more arguments are invalid
MOD_LIST: <ANALYSIS/>
NTGLOBALFLAG: …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将json字符串发布到.net wcf服务.
这是操作的定义:
[WebInvoke(Method = "POST", UriTemplate = "test/")]
[OperationContract]
[Description("Test")]
void Test(string input);
Run Code Online (Sandbox Code Playgroud)
我用fiddler发送我的测试.这里有小提琴信息:
POST http://localhost/test.svc/test/ HTTP/1.1
Content-Type: application/json
Host: localhost
Content-Length: 4
test
Run Code Online (Sandbox Code Playgroud)
我总是收到这个http 400错误:
反序列化System.String类型的对象时出错.令牌"真实"是预期的,但发现'测试'.
我究竟做错了什么?我敢肯定这可能是非常明显的事情,但我从今天早上就开始......
这个问题已被分解为最简单的表达方式.在现实世界中,我们想要发布一个实际上是JSON的字符串.但我们不希望.net处理反序列化,我们希望自己在服务中自己完成.
我正在尝试开发一个正则表达式,它将检测xsl样式表中的递归模板调用.
到目前为止,它还没有真正成功.
在下面的代码中,我需要检测模板B是否递归调用:
<xsl:template name="A">
blah blha ?!@#?%$#^%?*?&(({}:"><;'[]\/.,./'
<xsl:call-template name="B">
blah blah
</xsl:template>
<xsl:template name="B">
blah blha
<xsl:call-template name="B">
blah blah
</xsl:template>
<xsl:template name="C">
blah blha
<xsl:call-template name="B">
blah blah
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
在这种特定情况下,reg ex是可以的.
在我删除第二个B调用的情况下,正则表达式匹配最后一次调用B.这不应该发生.
(<xsl:template name=\"(?<templateName>\w+)\">.*?(?<=<xsl:call-template name=\"\k<templateName>\">).*?</xsl:template>)+
Run Code Online (Sandbox Code Playgroud)
我不是正则表达的大师.欢迎任何帮助.
谢谢.