代码之家  ›  专栏  ›  技术社区  ›  hiena

序列化代数数据类型

  •  0
  • hiena  · 技术社区  · 15 年前

    我有一个f库,其中包含一些值,我想用JSON在c_中序列化这些值。 对于寄存器,我没有问题,但是当我尝试序列化代数数据类型时,我遇到了错误。

    例如,假设这是f模块,我想序列化T1。

    module Module1=
    
        type Tree = Leaf  | Branch of Tree * int * Tree
    
        let t1 = Leaf
    

    在C中,我执行以下操作:

    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Module1.Tree));
    StreamWriter writer = new StreamWriter(@"c:\test");
    serializer.WriteObject(writer.BaseStream, Module1.t1);
    writer.Close();
    

    我有这个错误(在西班牙语中,因为我的Visual Studio是西班牙语:s)

    “不需要Espera el Tipo'ns.module1+tree+_leaf'con el nombre de contrato de datos'module1.tree._leaf: http://schemas.datacontract.org/2004/07/ns '.确定一个信息列表(Por ejemplo,Usando el Atributo KnownTypeattribute o AgReg_n dolos a la lista de Tipos Conocidos que se Pasa a DataContractSerializer)。”

    我的翻译: “数据协定名称'module1.tree.'u leaf'不应是'ns.module1+tree+'u leaf'类型。” http://schemas.datacontract.org/2004/07/ns网站 '.将未知类型静态添加到已知类型的列表中(例如,使用属性knowntyattribute或将其添加到传递给DataContractSerializer的已知类型列表中)。”

    有什么解决办法吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Anton Tykhyy    15 年前

    问题是,从clr的角度来看,对象被 t1 不是真正的类型 Module1.Tree 而是一个不相关的嵌套类型 Module1.Tree+_Leaf . 你需要通知 DataContractJsonSerializer 它可能会遇到这种类型的对象。希望在F运行时的某个地方有一个助手方法来列出此类编译器生成的嵌套类型;如果没有,则必须使用反射,例如。

    var serializer = new DataContractJsonSerializer (
        new List<Type> (typeof (Module1.Tree).GetNestedTypes ()) { // nested types
                        typeof (Module1.Tree),                     // root type
        }.ToArray ()) ;
    

    尽管我有点害怕编写这样的代码,除非f实际上指定了它如何从代数类型生成clr类型。