当前位置: 首页 > 面试题库 >

在WCF中更改默认日期序列化

梅飞宇
2023-03-14
问题内容

无论如何,是否可以在WCF中更改DateTime的默认JSON序列化/反序列化?

目前,DateTime已序列化为该/Date(1372252162657+0200)/格式,应该没问题,但是当我的服务器不在UTC中时(我无法更改),我遇到了问题。

此服务正在处理的所有日期/时间数据均为UTC格式。服务器处于UTC时一切正常。但是,暂存/生产环境设置为GMT +
1(Paris),并且序列化程序假定日期/时间在GMT +
1中,而完全忽略了该属性Kind。因此,正如您期望的那样DateTime.SetKind(),将其设置为UTC不会起作用。实际上,序列化的时间延迟了一个小时。

我既可以进行双向日期对话(在反序列化时也进行相同的假设,因此始终为GMT +
1):日期对话:UTC往返服务器时间,但这非常乏味。所以我想也许我可以覆盖默认的序列化行为。


问题答案:

是的,可以使用称为“ 消息格式器 ” 的概念来完成此操作

但是Message
Formatter会很困难并且超出范围,无法在此处解释堆栈溢出。您可以参考WCF可扩展性:消息格式化程序

如果您不希望将其弄乱,那么可以使用hack。

将每个方法的返回类型设置为Stream。

例如

        public Stream GetStaticData()
        {
            var objTobeReturned = something;
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
            return new MemoryStream(Encoding.UTF8.GetBytes(objTobeReturned.ToJson()));
        }

这里ToJson()是我自己的扩展方法,该方法使用NewtonSoft库将对象转换为json字符串。

WCF将跳过流输出以进行序列化,并将其原样传递给您的客户端。

我希望你能得到答案。



 类似资料:
  • 问题内容: 是否可以替换WCF的默认JSON序列化(我目前正在测试行为),并作为MIME类型传递。特别是,我不喜欢默认情况下每个属性都是键/值对,例如: 我仅将服务用于启用JSON的端点(使用jQuery + WCF请求数据)。 问题答案: 您可以使用消息格式化程序来更改用于处理JSON的序列化程序。https://docs.microsoft.com/zh- cn/archive/blogs/c

  • 但是,我发现该模块将使用DefaultJsonSerializer序列化Map和Entry对象(因为它们也是Object对象)。 如何更改默认序列化行为,同时确保条目和映射对象按预期序列化?

  • 问题内容: 尝试更改列的数据类型并设置新的默认值时遇到以下错误: 错误1064(42000):您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在第1行的’VARCHAR(255)NOT NULL SET DEFAULT’{}’‘附近使用正确的语法 问题答案: 同样的第二种可能性(感谢juergen_d):

  • 在尝试更改列的数据类型并设置新的默认值时,我遇到以下错误: 错误1064(42000):您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册,以了解第1行“varchar(255)NOT NULL SET DEFAULT”{}“附近使用的正确语法

  • 问题内容: 如何更改默认外壳?该命令当前显示: 我想将其更改为Bash。 问题答案: 尝试linux命令。 详细命令为。它将提示您输入密码。您的默认登录Shell 现在是。 您必须注销并重新登录才能看到此更改。 手册页中引用了以下内容: chsh命令更改用户登录外壳。这确定了用户初始登录命令的名称。普通用户只能为自己的帐户更改登录外壳,超级用户可以为任何帐户更改登录外壳 此命令将永久更改默认登录外

  • 你好,我想更改默认activity。但当我这样做的时候,应用程序启动时不会出现任何错误 这样Mainactivy就可以毫无问题地启动了。当我按下按钮时,它也会转到设备activity。所以一切正常。现在我需要DevcieACtivty成为默认的一个。 我就这样改变舱单 但现在应用程序没有上线。没有错误。控制台中没有任何内容。只是什么都做不到,会有什么问题吗? 开始写入以下错误ActivityMan