2014-12-28 2 views
0

Я играю f # и создаю серверную программу для удовольствия.с использованием Protobuf-Net с f # class

Я думаю, что я могу решить этот вопрос, используя f # для доступа к классу данных C#, но я хочу попробовать синтаксис f #.

я F # запись с [<CLIMutable>] работ, но F # класс получил ошибку

мой тестовый код:

open System 
open System.IO 
open ProtoBuf 

[<ProtoContract; Serializable>] 
type Point (m_x : int, m_y : int) = 
    [<ProtoMember(1)>] 
    member this.x = m_x 
    [<ProtoMember(2)>] 
    member this.y = m_y 

[<EntryPoint>] 
let main argv = 
    let p : Point = new Point(10, 10) 
    let out = Console.OpenStandardOutput() 
    Serializer.Serialize<Point>(out, p) 
    printfn "finish" 
    0 

и я получил следующий вывод:

Unhandled Exception: 
System.InvalidOperationException: Cannot apply changes to property Program+Point.x 
    at ProtoBuf.Serializers.PropertyDecorator.SanityCheck (ProtoBuf.Meta.TypeModel model, System.Reflection.PropertyInfo property, IProtoSerializer tail, System.Boolean& writeValue, Boolean nonPublic, Boolean allowInternal) [0x00000] in <filename unknown>:0 
    at ProtoBuf.Serializers.PropertyDecorator..ctor (ProtoBuf.Meta.TypeModel model, System.Type forType, System.Reflection.PropertyInfo property, IProtoSerializer tail) [0x00000] in <filename unknown>:0 
... 

ответ

1

Хотя я не знаю, о Protobuf я подозреваю, что его сериализация не может назначить новое значение для полей Point Point, потому что в F # они по умолчанию неизменяемы. Вы можете изменить определение класса для использования изменяемых полей/свойств:

open System 
open System.IO 
open ProtoBuf 

[<ProtoContract; Serializable>] 
type Point (m_x : int, m_y : int) = 
    let mutable vx = 0 
    let mutable vy = 0 
    do 
     vy <- m_y 
     vx <- m_x 

    [<ProtoMember(1)>] 
    member this.x with get() = vx and set v = vx <- v 
    [<ProtoMember(1)>] 
    member this.y with get() = vy and set v = vy <- v 

Возможно, это поможет. Также если запись F # с [] работает, возможно, проще использовать записи? Записи в членах поддержки F #, а также классы.

+0

Я только что нашел это сам. Я забыл функцию setter. Спасибо за ваш быстрый ответ. – user1429171

Смежные вопросы