/// <summary> /// Encodes the object in the specified stream. /// </summary> /// <param name="messageContext">The context.</param> /// <param name="stream">The stream to use.</param> public override void Encode(IServiceMessageContext messageContext, Stream stream) { bool topLevelIsArray = !HasNetworkMessageHeader && !HasSingleDataSetMessage && !IsMetaDataMessage; using (JsonEncoder encoder = new JsonEncoder(messageContext, true, topLevelIsArray, stream)) { if (IsMetaDataMessage) { EncodeNetworkMessageHeader(encoder); encoder.WriteEncodeable(kFieldMetaData, m_metadata, null); return; } // handle no header if (HasNetworkMessageHeader) { Encode(encoder); } else if (DataSetMessages != null && DataSetMessages.Count > 0) { if (HasSingleDataSetMessage) { // encode single dataset message JsonDataSetMessage jsonDataSetMessage = DataSetMessages[0] as JsonDataSetMessage; if (jsonDataSetMessage != null) { if (!jsonDataSetMessage.HasDataSetMessageHeader) { // If the NetworkMessageHeader and the DataSetMessageHeader bits are not set // and SingleDataSetMessage bit is set, the NetworkMessage is a JSON object // containing the set of name/value pairs defined for a single DataSet. jsonDataSetMessage.EncodePayload(encoder, false); } else { // If the SingleDataSetMessage bit of the NetworkMessageContentMask is set, // the content of the Messages field is a JSON object containing a single DataSetMessage. jsonDataSetMessage.Encode(encoder); } } } else { // If the NetworkMessageHeader bit of the NetworkMessageContentMask is not set, // the NetworkMessage is the contents of the Messages field (e.g. a JSON array of DataSetMessages). foreach (var message in DataSetMessages) { JsonDataSetMessage jsonDataSetMessage = message as JsonDataSetMessage; if (jsonDataSetMessage != null) { jsonDataSetMessage.Encode(encoder); } } } } } }
/// <summary> /// Encodes the object and returns the resulting byte array. /// </summary> /// <returns></returns> public override byte[] Encode() { ServiceMessageContext messageContext = new ServiceMessageContext(); messageContext.NamespaceUris = ServiceMessageContext.GlobalContext.NamespaceUris; messageContext.ServerUris = ServiceMessageContext.GlobalContext.ServerUris; bool topLevelIsArray = !HasNetworkMessageHeader && !HasSingleDataSetMessage; using (JsonEncoder encoder = new JsonEncoder(messageContext, false, null, topLevelIsArray)) { // handle no header if (HasNetworkMessageHeader) { Encode(encoder); } else if (DataSetMessages != null && DataSetMessages.Count > 0) { if (HasSingleDataSetMessage) { // encode single dataset message JsonDataSetMessage jsonDataSetMessage = DataSetMessages[0] as JsonDataSetMessage; if (jsonDataSetMessage != null) { if (!jsonDataSetMessage.HasDataSetMessageHeader) { // (UA Specs:) If the NetworkMessageHeader and the DataSetMessageHeader bits are not set // and SingleDataSetMessage bit is set, the NetworkMessage // is a JSON object containing the set of name/value pairs defined for a single DataSet. jsonDataSetMessage.EncodePayload(encoder, false); } else { // If the SingleDataSetMessage bit of the NetworkMessageContentMask is set, // the content of the Messages field is a JSON object containing a single DataSetMessage. jsonDataSetMessage.Encode(encoder); } } } else { // If the NetworkMessageHeader bit of the NetworkMessageContentMask is not set, // the NetworkMessage is the contents of the Messages field (e.g. a JSON array of DataSetMessages). foreach (var message in DataSetMessages) { JsonDataSetMessage jsonDataSetMessage = message as JsonDataSetMessage; if (jsonDataSetMessage != null) { jsonDataSetMessage.Encode(encoder); } } } } byte[] bytes = System.Text.Encoding.ASCII.GetBytes(encoder.CloseAndReturnText()); return(bytes); } }