Интерфейс F#/абстрактный тип и сериализация

Я пишу небольшой движок машинного обучения поверх фреймворка orleans с помощью orleankka. Мне нужно отношение родительского дочернего класса, где родитель поддерживает получение, установку, конструктор по умолчанию и сериализацию. Мои попытки не увенчались успехом в F #.

Обновление: используется интерфейс, теперь мне просто нужно выяснить сериализацию объекта канала изображения.

type imagechannel = int * int * char array[][]


type Iobject =
    abstract Value : obj with get, set
    abstract FromSerial : SerializationInfo -> StreamingContext -> unit
    abstract ToSerial : SerializationInfo -> StreamingContext -> unit

type ImageChannel() =
    let mutable value : option<imagechannel> = None
    interface Iobject with
        member this.Value with get() = value :> obj and set v = value <- v :?> option<imagechannel>
        member this.FromSerial info context =

        member this.ToSerial info context =

Код контекста:

type ProcessorMessage =
    | Eval of (Iobject -> Parms -> Iobject) * Parms
    | New of Iobject
    | Value
    | Load of cache
    | Save of cache
    | Trans of string * (Iobject -> Parms -> Iobject) * Parms

type Processor() =
    inherit Actor<ProcessorMessage>()

    let mutable value :option<Iobject> = None

    override this.Receive message reply = task {
      match message with
          | Eval(fn,p) -> value <- (fn value p)
          | Load(cache) -> //deserialize value
          | Save(cache) -> //serialize value
          | New(v) -> value <- v
          | Value -> reply value
          | Trans(addr,fn,p) -> let proc = this.System.ActorOf(addr)
                                proc <! New (fn value p) |> ignore

      }

Должен ли я реализовать интерфейс сериализации напрямую? Как переопределить элемент абстрактного значения другим типом? Любые другие предложения?


person Orlando    schedule 20.06.2015    source источник
comment
Где у тебя проблемы?   -  person Mark Seemann    schedule 21.06.2015
comment
Мне тоже трудно понять проблему - для чего нужна сериализация?   -  person Random Dev    schedule 21.06.2015
comment
Вам следует поговорить с Евгением Бобровым (автор), он доступен на Gitter @ gitter.im/yevhen/Orleankka всегда готов помочь :)   -  person Elan Hasson    schedule 19.07.2015


Ответы (2)


Я думаю, вам не нужны скобки в определении вашего интерфейса.

type Iobject() =

Должно быть

type Iobject =
person Kit    schedule 21.06.2015
comment
хотя это правда (Iobject здесь класс, а не интерфейс), решает ли это проблему OP? - person Random Dev; 21.06.2015
comment
@Carsten Я думаю, мы узнаем, когда OP скажет, в чем их проблема. ;-) - person Kit; 21.06.2015
comment
... и сделав его интерфейсом (без скобок), вам нужно будет поместить интерфейс Iobject с... - person Kit; 21.06.2015
comment
@Carsten @Kit Я разобрался с частью интерфейса, но мне все еще нужно найти хороший способ сериализации. Смотрите обновление. Должен ли я изменить кортеж imagechannel на тип записи и использовать атрибут [<Datacontract>]. Или есть хороший способ сериализовать/десериализовать кортеж основных типов? - person Orlando; 22.06.2015
comment
@Orlando, какая сериализация (фреймворк) и какой формат? Лично я бы не стал использовать Datacontracts (те дни прошли, IMO) - если фреймворк не может обрабатывать записи как есть - обычно достаточно просто добавить CLIMutable — атрибут записи. - person Random Dev; 22.06.2015

Я изменил образец Hello World http://tinyurl.com/pgxs6nv, используя интерфейсы, и сериализация работает правильно. Не могли бы вы дать нам больше информации об ошибке?

type imagechannel = int * int

type IObject =
    abstract Value : obj with get, set

type ImageChannel() =
    let mutable value : option<imagechannel> = None    
    interface IObject with
      member this.Value with get() = value :> obj and set v = value <- v :?> option<imagechannel>

type ImageChannel2() =
    let mutable value : string = ""    
    interface IObject with
      member this.Value with get() = value :> obj and set v = value <- v :?> string

type Message = 
   | Greet of string
   | Hi
   | New of IObject

type Greeter() = 
   inherit Actor<Message>()   

   override this.Receive message reply = task {
      match message with
      | Greet who -> printfn "Hello %s" who
      | Hi -> printfn "Hello from F#!"
      | New iObj -> printfn "Obj %s" (iObj.Value.ToString())
   }

[<EntryPoint>]
let main argv = 

    printfn "Running demo. Booting cluster might take some time ...\n"

    use system = ActorSystem.Configure()
                            .Playground()
                            .Register(Assembly.GetExecutingAssembly())
                            .Done()

    let actor = system.ActorOf<Greeter>(Guid.NewGuid().ToString())
    let imgChannel = ImageChannel() :> IObject
    imgChannel.Value <- Some(5,1) :> obj    

    let imgChannel2 = ImageChannel2() :> IObject
    imgChannel2.Value <- "asdasdasd" :> obj    

    let job() = task {
      do! actor <! New imgChannel
      do! actor <! New imgChannel2
      do! actor <! Hi
      do! actor <! Greet "Yevhen"
      do! actor <! Greet "AntyaDev"
    }
person AntyaDev    schedule 19.07.2015
comment
Я думаю, я не хотел вбрасывать вещи в объекты и из них, чтобы перемещать их, но при этом иметь абстрактный процессор. Но не думайте, что я не могу иметь и то, и другое. - person Orlando; 02.08.2015