Исключение сериализуемого объекта FSharp - PullRequest
1 голос
/ 21 ноября 2011

У меня есть класс F #, который должен быть сериализован.

Чтобы показать мою проблему, я сделал это навалом:

[<Serializable>]
type TestValidator(min) =
    let Test value = 
        min < value

Когда я хочу сериализовать / десериализовать это, я получаю следующее сообщение об ошибке: Двоичный поток '0' не содержит допустимого BinaryHeader. Возможные причины: неверное изменение потока или версии объекта между сериализацией и десериализацией.

Пример кода C # для сериализации:

var test = new Validator.TestValidator(0);
var ser = CodeHelper.ByteUtils.BinarySerializeObject(test);
var deser = CodeHelper.ByteUtils.BinaryDeSerializeObject(ser.Generic);

CodeHelper.ByteUtils.BinarySerializeObject:

   public static DetailedBoolObjectRet<byte[]> BinarySerializeObject(object input)
    {
        try
        {
            var ms = new MemoryStream();
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(ms, input);
            byte[] bytes = new byte[ms.Length];
            ms.Position = 0;
            ms.Read(bytes, 0, bytes.Length);

            return new DetailedBoolObjectRet<byte[]>(bytes, true);
        }
        catch (System.Exception exc)
        {
            Debug.Assert(false, exc.Message);
            return new DetailedBoolObjectRet<byte[]>(null, false, exc.Message);
        }
    }

 public static DetailedBoolObjectRet<object> BinaryDeSerializeObject(byte[] input)
    {
        try
        {
            var ms = new MemoryStream(input);
            BinaryFormatter formatter = new BinaryFormatter();
            var deserialized = formatter.Deserialize(ms);

            return new DetailedBoolObjectRet<object>(deserialized, true);
        }
        catch (System.Exception exc)
        {
            Debug.Assert(false, exc.Message);
            return new DetailedBoolObjectRet<object>(null, false, exc.Message);
        }
    }

В чем может быть проблема с сериализацией?

1 Ответ

1 голос
/ 22 ноября 2011

Я просто бросил тест

open System
open System.IO
open System.Runtime.Serialization.Formatters.Binary

[<Serializable>]
type TestValidator(min) =
    let Test value = 
        min < value


let test = new TestValidator(0)
let ms = new MemoryStream()
let formatter = new BinaryFormatter()
formatter.Serialize(ms, test)
let bytes = Array.init (int ms.Length) (fun i -> byte 0x00)
ms.Position <- int64 0
ms.Read(bytes,0,int ms.Length)

let des =
    let ms = new MemoryStream(bytes)
    let formatter = new BinaryFormatter()
    formatter.Deserialize(ms) :?> TestValidator

Кажется, работает нормально ... Возможно, есть проблема с "DetailBoolObjectRet"? Исключение, которое вы получаете, вы можете воспроизвести, пытаясь десериализовать массив 0x00.

EDIT:

Если ваша проблема связана с C #, попробуйте

[<Serializable>]
type TestValidator(min:int) =
    let Test value = 
        min < value

Хотя, может быть, это не то, что вам нужно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...