private IASValue ReadMixedArray() { int length = input.ReadInt(); if (length < 0) { throw new AMFException(ExceptionPrefix + "Encountered negative MixedArray length."); } // Important: Add the array to the cache before deserializing its properties! ASArray result = ASArray.CreateUninitializedInstance(); AddObjectToCache(result); IASValue[] indexedValues = length == 0 ? EmptyArray <IASValue> .Instance : new IASValue[length]; IDictionary <string, IASValue> mixedValues = null; for (;;) { string key = input.ReadShortString(); if (key.Length == 0) { break; } IASValue value = input.ReadObject(); // If the string looks like a valid index, then stuff it into the array. int index; if (int.TryParse(key, NumberStyles.None, CultureInfo.InvariantCulture, out index) && index >= 0 && index < length) { indexedValues[index] = value; } else { // Otherwise add it as a mixed value. if (mixedValues == null) { mixedValues = new Dictionary <string, IASValue>(); } mixedValues.Add(key, value); } } if (mixedValues == null) { mixedValues = EmptyDictionary <string, IASValue> .Instance; } ConsumeEndOfObject(); result.SetProperties(indexedValues, mixedValues); return(result); }
/// <summary> /// Reads AMF content from an input stream. /// </summary> /// <param name="input">The input stream</param> /// <param name="contentLength">The length of the content to read in bytes</param> /// <returns>The content object</returns> private static IASValue ReadAMFContent(AMFDataInput input, int contentLength) { input.BeginObjectStream(); try { // TODO: validate for content length return(input.ReadObject()); } finally { input.EndObjectStream(); } }
/// <summary> /// Reads AMF content from an input stream. /// </summary> /// <param name="input">The input stream</param> /// <param name="contentLength">The length of the content to read in bytes</param> /// <returns>The content object</returns> private static IASValue ReadAMFContent(AMFDataInput input, int contentLength) { input.BeginObjectStream(); try { // TODO: validate for content length return input.ReadObject(); } finally { input.EndObjectStream(); } }
private object FromAMF(byte[] bytes) { IActionScriptSerializer serializer = serializerFactory.CreateSerializer(); MemoryStream stream = new MemoryStream(bytes); AMFDataInput dataInput = new AMFDataInput(stream, serializer); dataInput.BeginObjectStream(); IASValue asValue = dataInput.ReadObject(); dataInput.EndObjectStream(); object nativeValue = serializer.ToNative(asValue, null); return nativeValue; }