小编Jea*_*ois的帖子

如何使用.NET XmlSerializer使值类型为空?

让我们假设我有这个对象:

[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(零)时.


看起来你必须实现自定义序列化.

是的,那也是我的意思,但我想在没有它的情况下逃脱.

在应用程序中,对象要复杂得多,我不想自己处理序列化.

c# null xml-serialization value-type

29
推荐指数
3
解决办法
3万
查看次数

如何使用json动态成员获得WCF DataContract

在我正在开发的项目中,我们需要一个可以包含一些未定义的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)

可能的解决方案:

  1. 使用Stream作为请求正文的合约参数.工作,但把工作放在我们这边,而不是使用框架.
  2. 将"json"定义为DynamicObject.不行.无法正确写入财产.
  3. 使用Newtonsoft库,更改WCF端点中的默认协定序列化程序,以序列化JObject的所有输入.我们还处理请求的序列化,它会导致我们的应用程序出现问题.我们宁愿避免这种方式.

有没有人可以解决这个问题?

编辑

该服务提供休息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

c# wcf serialization json

8
推荐指数
1
解决办法
9033
查看次数

Json.net松散vs严格类型反序列化

在我正在开发的项目中,我们开始使用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".

问题:

  1. 有没有办法强制执行严格的序列化?

  2. 是否有其他类型的字符串具有隐式转换,就像我们在这里看到的那样?

谢谢.

JF

.net wcf serialization json.net deserialization

8
推荐指数
1
解决办法
2208
查看次数

崩溃转储 - 使用WinDbg解决.NET应用程序中的非托管代码崩溃问题

我正在尝试发现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)

windbg dump crash-dumps

7
推荐指数
2
解决办法
2万
查看次数

将字符串参数发布到WCF服务会导致反序列化错误

我正在尝试将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处理反序列化,我们希望自己在服务中自己完成.

.net rest wcf json

2
推荐指数
1
解决办法
2793
查看次数

正则表达式 - 在2个指定边界之间找到特定文本

我正在尝试开发一个正则表达式,它将检测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)

我不是正则表达的大师.欢迎任何帮助.

谢谢.

regex recursion

0
推荐指数
1
解决办法
153
查看次数