C#OData开放类型序列化

时间:2018-12-18 13:58:11

标签: c# odata

我有OData model的{​​{1}}

class X:

当我为此类发布新实体时,如果该字段是开放类型且为Utf8,则属性字段(开放类型<EntityType Name="X" OpenType="true"> <Key> <PropertyRef Name="id" /> </Key> <Property Name="name" Type="Edm.String" /> <Property Name="logo" Type="Edm.String" /> </EntityType> )将使用这些UTF字符进行填充。如果我对非开放式字段(例如名称)执行相同操作,则数据正常。

例如:如果我发送使用(这是我在POST请求中发送的json)创建新IDictionary<string, object>的请求

entity X

它将被序列化为(这是我在OData控制器中获得的实体)

{"name":"ä,ö,ü", "nameOpenType":"ä,ö,ü"} 

问题是“ nameOpenType”变成了不可读的字符串,而不是与“ name”相同。
当我将POST请求发送到OData控制器时,序列化由OData默认完成。
我该如何解决?

1 个答案:

答案 0 :(得分:1)

我可以重现该问题。控制器已正确接收UTF8。然后,在进行模型绑定时,odata反序列化器会出错。

为什么哦,为什么我们仍然遇到这类问题。有人发明了另一个内置标识符的字符串编码,例如UTF8文件的BOM。

要修复它并读取所需的字符串:

   static string DecodeEncodedNonAsciiCharacters(string value)
    {
        return Regex.Replace(
            value,
            @"\\u(?<Value>[a-zA-Z0-9]{4})",
            m => { return ((char)int.Parse(m.Groups["Value"].Value,
            NumberStyles.HexNumber)).ToString(); });
    }

此处的代码https://stackoverflow.com/a/1615860/5223937