के साथ अज्ञात प्रकार को Deserialize मेरे पास 2 नेटवर्क वाले ऐप्स हैं जो एक दूसरे को क्रमबद्ध प्रोटोबफ-नेट संदेश भेजना चाहिए। मैं ऑब्जेक्ट्स को क्रमबद्ध कर सकता हूं और उन्हें भेज सकता हूं, हालांकि, मैं यह नहीं समझ सकता कि प्राप्त बाइट को कैसे deserialize करना है।प्रोटोबफ-नेट
मैंने इसके साथ deserialize करने की कोशिश की और यह एक NullReferenceException के साथ विफल रहा।
// Where "ms" is a memorystream containing the serialized
// byte array from the network.
Messages.BaseMessage message =
ProtoBuf.Serializer.Deserialize<Messages.BaseMessage>(ms);
मैं धारावाहिक बाइट्स कि संदेश प्रकार आईडी है, जो मैं एक विशाल स्विच बयान में उपयोग कर सकते हैं उम्मीद sublcass प्रकार वापस जाने के लिए होता है से पहले एक हैडर गुजर रहा हूँ। नीचे दिए गए ब्लॉक के साथ, मुझे त्रुटि मिलती है: System.Reflection.TargetInvocationException ---> System.NullReferenceException।
//Where "ms" is a memorystream and "messageType" is a
//Uint16.
Type t = Messages.Helper.GetMessageType(messageType);
System.Reflection.MethodInfo method =
typeof(ProtoBuf.Serializer).GetMethod("Deserialize").MakeGenericMethod(t);
message = method.Invoke(null, new object[] { ms }) as Messages.BaseMessage;
यहाँ समारोह मैं नेटवर्क पर संदेश भेजने के लिए इस्तेमाल है: आधार वर्ग के साथ
internal void Send(Messages.BaseMessage message){
using (System.IO.MemoryStream ms = new System.IO.MemoryStream()){
ProtoBuf.Serializer.Serialize(ms, message);
byte[] messageTypeAndLength = new byte[4];
Buffer.BlockCopy(BitConverter.GetBytes(message.messageType), 0, messageTypeAndLength, 0, 2);
Buffer.BlockCopy(BitConverter.GetBytes((UInt16)ms.Length), 0, messageTypeAndLength, 2, 2);
this.networkStream.Write(messageTypeAndLength);
this.networkStream.Write(ms.ToArray());
}
}
इस वर्ग,, मैं serializing कर रहा हूँ:
[Serializable,
ProtoContract,
ProtoInclude(50, typeof(BeginRequest))]
abstract internal class BaseMessage
{
[ProtoMember(1)]
abstract public UInt16 messageType { get; }
}
[Serializable,
ProtoContract]
internal class BeginRequest : BaseMessage
{
[ProtoMember(1)]
public override UInt16 messageType
{
get { return 1; }
}
}
मार्क ग्रेवेल के सुझाव का उपयोग कर फिक्स्ड। मैंने पाठक गुणों से ProtoMember विशेषता को हटा दिया। SerializeWithLengthPrefix का उपयोग करने के लिए भी स्विच किया गया।
//where "this.Ssl" is an SslStream.
BaseMessage message =
ProtoBuf.Serializer.DeserializeWithLengthPrefix<BaseMessage>(
this.Ssl, ProtoBuf.PrefixStyle.Base128);
एक वस्तु भेजने के लिए::
[Serializable,
ProtoContract,
ProtoInclude(50, typeof(BeginRequest))]
abstract internal class BaseMessage
{
abstract public UInt16 messageType { get; }
}
[Serializable,
ProtoContract]
internal class BeginRequest : BaseMessage
{
public override UInt16 messageType
{
get { return 1; }
}
}
एक वस्तु प्राप्त करने के लिए: यहाँ है कि मैं क्या अब है
//where "this.Ssl" is an SslStream and "message" can be anything that
// inherits from BaseMessage.
ProtoBuf.Serializer.SerializeWithLengthPrefix<BaseMessage>(
this.Ssl, message, ProtoBuf.PrefixStyle.Base128);
मैं उल्लेख करना भूल गया, मैं मोनो 2.2 में Windows और deserializing पर .NET 3.5 में serializing कर रहा हूँ और एक मंच पर उचित Protobuf शुद्ध DLLs उपयोग कर रहा हूँ। –
मैं इसे पढ़ने के लिए वापस आऊंगा और लगभग आधे घंटे में जवाब पोस्ट करूंगा ... इस समय भागना होगा, क्षमा करें। बीटीडब्लू - अगली रिलीज में गैर-जेनेरिक रैपर शामिल हैं - अभी भी इस समय मेरे लैपटॉप पर। –
बीटीडब्ल्यू - मैं अपनी स्थानीय प्रतिलिपि विलय करने पर काम कर रहा हूं, इसलिए मैं इसे आसान बनाने के लिए परिवर्तन कर सकता हूं। मेरे पास एक उत्कृष्ट परीक्षण-असफल है, लेकिन इसमें नए कोड शामिल हैं, इसलिए यदि यह मदद करता है तो मैं इसे प्रतिबद्ध करने के लिए संतुष्ट हूं (अनदेखा के रूप में चिह्नित)। –