【问题标题】:Deserialize JSON Map in a constant-foldable way C#以恒定可折叠的方式反序列化 JSON Map C#
【发布时间】:2020-10-20 02:56:03
【问题描述】:

我需要将 映射的字符串表示形式传递到我的 U-SQL 程序中,并将其反序列化为 C# Dictionary,然后我可以将其转换为 U-SQL SqlMap。我需要以 constant-foldable 的方式进行。我最近的尝试:

DECLARE @MapStr string = "{\"key\": \"val\"}";
DECLARE CONST @map = new SqlMap<string,string>(JsonConvert.DeserializeObject<Dictionary<string, string>>(@MapStr));

失败并显示“E_CSC_USER_EXPRESSIONNOTCONSTANTFOLDABLE:表达式不能被常量折叠。”

我找到了许多将字符串反序列化为映射的方法,但到目前为止还没有一种方法是恒定可折叠的。我找不到常量可折叠 c# 表达式的列表,这在这里也会有所帮助。

【问题讨论】:

    标签: c# deserialization u-sql constantfolding


    【解决方案1】:

    来自docs:

    ...可以在编译时计算(所谓的常量可折叠表达式)

    在 C# 中,常量是 defined as:

    在编译时已知并且在程序的生命周期内不会改变的不可变值。常量使用 const 修饰符声明。只有 C# built-in 类型(不包括 System.Object)可以声明为 const。用户定义的类型,包括类、结构体和数组,不能是 const。

    看来你只能使用可以在 C# 中定义为常量的东西,所以你只能使用 built-in 类型的表达式(不包括 System.Object)。

    【讨论】:

    • 感谢您的链接!这很有趣,因为文档明确指出数组不能是 const,但我们已经使用 String.Split() 函数实现了这一点——我想这是可行的,因为字符串表达式是 const 可折叠的,所以即使结果是一个数组,它也是美好的?遗憾的是,我没有看到任何可以制作地图的字符串函数。您认为最好的做法是只使用 2 个有序数组(键数组和值数组)吗?
    • @Alex,很有趣。如果它适用于数组,也许可以试试... @map =new SqlMap&lt;string,string&gt; { {"key", "val"}}; ?
    • 遗憾的是,我不能这样做,因为键值对必须作为字符串传递到程序中,所以我错过了字符串和您建议的表达式之间的链接(确实似乎是 const 可折叠的!)。关于如何将它变成那种形式的任何想法?
    • @Alex 我在这里超出了我的深度。这个字符串是在运行时还是编译时传入程序的?
    • 它在编译时——它的工作方式是将 DECLARE 语句(就像我的代码 sn-p 中的第一行)添加到主脚本的顶部,然后我们将其解析为其他类型如果需要的话。它被 ADF 调用,我们只能将字符串从 ADF 传递给 ADLA。如果看起来不可能,请不要担心!如果是这种情况,我将只使用有序数组,这很烦人但很有效。
    【解决方案2】:

    如果其他人好奇,我相信这是不可能的:

    • 只有字符串和内置类型表达式是常量可折叠的,不包括对象(例如数组和映射)。 (有关此链接,请参阅其他答案)
    • 没有内置表达式或字符串表达式可以计算为 SqlMap
    • 因此,没有可计算为 SqlMap 的常量可折叠表达式

    出于我的特定目的,我能够使用创建 CONST SqlMaps 的配置文件并使用它,但如果我们有超过一组有限的可能输入,那将是不可能的。

    【讨论】:

      猜你喜欢
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      相关资源
      最近更新 更多