c# - 大型机平面文件到 C# 类

标签 c# reflection flat-file dynamic-typing static-typing

我必须使用 IBM WebSphere 与 IBM 主机进行通信。 主机端的服务只能使用平面文件。

在我这边,我想使用 CQRS(命令/查询)

换句话说,我想序列化命令/查询并反序列化查询结果

我当然可以用标准反射来做到这一点,但我的问题是是否有更好的方法?

我可以利用动态吗?

Flatfile > ParsedObjectStructured > Dynamic type > static type

最佳答案

这在很大程度上取决于平面文件的格式以及模式的工作方式 - 例如,它是否是自描述的?然而,在我看来,这里的大部分工作都是理解平面文件格式(和模式绑定(bind))。从那里开始,“反序列化为静态类型”与“反序列化为动态类型”的选择有点没有意义,我想说,反序列化为动态类型只是为了将其全部映射到静态类型没有什么意义。类型。此外,如果文件格式需要规范,静态类型可以(同样,取决于文件格式的具体情况)是一个方便的地方来装饰类型以表示“这里是如何解释它”。例如(我完全是在写作过程中编造的 - 不要指望这与您的格式有关):

[Frobber(Offset = 4, Format = DataFormat.LittleEndianInt32)]
public int Id {get;set;}

[Frobber(Offset = 0, Format = DataFormat.LittleEndianInt32)]
public int Index {get;set;}

[Frobber(Offset = 8, Format = DataFormat.FixedAscii, Size = 20)]
public string Name {get;set;}

[Frobber(Offset = 28, Format = DataFormat.Blob)] // implicit Size=16 as Guid
public Guid UniqueKey {get;set;}

其中 FrobberAttribute 只是您可能发明的用于指定文件格式的东西。当然,如果模式是在文件内部定义的,则这可能不是必需的。

重新反射:如果数据使用量相当少,基本反射就可以正常工作;但总体而言,反射的成本可能相当高。如果您需要它是最佳的,您可能希望实现考虑策略缓存(即只执行一次发现工作)和元编程(将策略转变为现成的 IL,而不是比在运行时产生反射的开销)。

如果文件格式是常见/流行的格式,您可能会发现已有工具可用于读取该格式。如果没有,您可以自己动手,或者找一些喜欢编写序列化和元编程工具的疯狂人。这样的人确实存在...

关于c# - 大型机平面文件到 C# 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18714496/

相关文章:

c# 代码似乎以一种无效的方式进行了优化,使得对象值变为 null

.net - 如何使用反射调用 .NET 中的重载方法

java - 类型不匹配 : cannot convert from Class<capture#1-of ? > 到 Class<?>[]

c# - 无法用定界符分隔文本文件 |

database - 如何最好地将大型 JSON 文档(2+ MB)存储在数据库中?

c# - 如何将我的控制台应用程序 dll 放入逻辑应用程序调度程序而不是 Web 作业中?

c# - 80040154 类未注册(HRESULT 异常 : 0x80040154 (REGDB_E_CLASSNOTREG))

c# - 为什么我会收到 System.InvalidOperationException?

python - 如何以编程方式更改 python 装饰器中函数的 argspec?

utf-8 - SSIS - 平面文件始终采用 ANSI 编码,从不采用 UTF-8 编码