2016-09-01 3 views
4

Ich möchte mein Objekt serailisieren und verwendet BinaryFormatter Klasse.Binäre Serialisierung ohne serialisierbare Attribut

public static byte[] BinarySerialize(IMessage message) 
{ 
    using (var stream = new MemoryStream()) 
    { 
     var formatter = new BinaryFormatter(); 

     formatter.Serialize(stream, message); 

     return stream.ToArray(); 
    } 
} 

Aber wenn ich den Code ausführen, löst eine Ausnahme aus.

SerializationException: Objekt ist nicht als serialisierbar gekennzeichnet.

Ich denke, diese Ausnahme von BinaryFormatter geworfen.

Ich will nicht als [Serializable] meine Objekte markieren. Oder meine Bibliothek Benutzer können als [Serializable] ihre eigenen Nachrichten vergessen.

Gibt es eine andere Möglichkeit, meine Objekte binär serialisiert ohne Attribut [Serializable]?

+0

prüfen Protobuf, die nicht Serializable-Attribut –

+0

var result = BinarySerialize (JsonConvert.SerializeObject (Nachricht)) benötigen wird; – CRice

+0

var Bytes = Encoding.UTF8.GetBytes (JsonConvert.SerializeObject (Nachricht)); – CRice

Antwort

0

Da Attribut [Serializable] kann nicht Laufzeit hinzugefügt werden, da noOptions sind, wenn Sie auf die .Net in Serialisierung gebaut haften möchten.

Sie können

  1. Verwendung ISerializable Schnittstelle in IMessage, so dass Benutzer haben Serialisierung in ihren Implementierungen wie http://sharpserializer.codeplex.com/

    public static byte[] BinarySerialize(IMessage message) 
    { 
        using (var stream = new MemoryStream()) 
        { 
         var serializer = new SharpSerializer(true); 
    
         serializer.Serialize(message, stream); 
    
         return stream.ToArray(); 
        } 
    } 
    
  2. Verwenden JSON Serialisierung

  3. Verwendung Dritte Bibliothek implementieren

+0

Json wird Text Serialisierung, OP benötigt binäre Serialisierung, passt möglicherweise nicht in –

+0

Yeah .. dann am einfachsten wäre sharpserializer verwenden, mit minimalen Änderungen an seinem Code –

0

Option wäre, die 3rd-Party-Option verwenden, wie ProtoBuf, überprüfen ProtoBuf-Github, kann es mit oder ohne Attribute verwendet werden. Wenn Sie die Attribute nicht verwenden möchten, müssen Metadaten mit dem Programm hinzugefügt werden.

Etwas wie:

[ProtoContract] 
public class A 
{ 
    [ProtoMember(1)] 
    public int A1 { get; set; } 
    [ProtoMember(2)] 
    public string A2 { get; set; } 
    [ProtoMember(3)] 
    public float A3 { get; set;} 
} 

Ruft umgewandelt:

var AMetaType = RuntimeTypeModel.Default.Add(typeof (A), false); 
AMetaType.Add(1, "A1"); 
AMetaType.Add(2, "A2"); 
AMetaType.Add(3, "A3"); 

Serialisierung/De-Serialisierung ist einfach:

Serialisierung (Ergebnis in Datei-Stream kann auch verwenden Speicher Stream)

A objectA; 
using (var fs = File.Create(<File_Name>)) 
{ 
    Serializer.Serialize(fs, objectA); 
} 

De-Serialisierung

using (var fs = File.OpenRead(<File_Name>)) 
{ 
    A objA = Serializer.Deserialize<A>(fs); 
    // use objA further 
} 
Verwandte Themen