public static IGenericSerializable FromByteArray(ArraySegment <byte> Data)
        {
            if (Data.Count == 0)
            {
                return(null);
            }

            var Ref  = (SerializationGenericReference)BondSerializer.Deserialize(typeof(SerializationGenericReference), new ArraySegmentReaderStream(Data));
            var Type = BondSerializationUtil.ParseTypeIdentifierString(Ref.Type);

            return((IGenericSerializable)BondSerializer.Deserialize(Type, new MemoryStream(Ref.Data.ToArray())));
        }
        public static ArraySegment <byte> ToByteArray(GrainReference GrainRef)
        {
            var KeyString = GrainRef.ToKeyString();
            var Ref       = new SerializationGrainReference(0);

            // Parse grain reference key string
            string grainIdStr;
            int    grainIdIndex = (GRAIN_REFERENCE_STR + "=").Length;

            int genericIndex      = KeyString.IndexOf(GENERIC_ARGUMENTS_STR + "=", StringComparison.Ordinal);
            int observerIndex     = KeyString.IndexOf(OBSERVER_ID_STR + "=", StringComparison.Ordinal);
            int systemTargetIndex = KeyString.IndexOf(SYSTEM_TARGET_STR + "=", StringComparison.Ordinal);

            if (genericIndex >= 0)
            {
                grainIdStr = KeyString.Substring(grainIdIndex, genericIndex - grainIdIndex).Trim();

                string genericStr = KeyString.Substring(genericIndex + (GENERIC_ARGUMENTS_STR + "=").Length);
                if (!String.IsNullOrEmpty(genericStr))
                {
                    Ref.GenericArgs = ParseAndConvertGenericArgsString(genericStr);
                }
            }
            else if (observerIndex >= 0)
            {
                grainIdStr = KeyString.Substring(grainIdIndex, observerIndex - grainIdIndex).Trim();

                string observerIdStr = KeyString.Substring(observerIndex + (OBSERVER_ID_STR + "=").Length);
                Ref.ObserverReferenceId = Guid.Parse(observerIdStr);
            }
            else if (systemTargetIndex >= 0)
            {
                grainIdStr = KeyString.Substring(grainIdIndex, systemTargetIndex - grainIdIndex).Trim();

                string systemTargetStr = KeyString.Substring(systemTargetIndex + (SYSTEM_TARGET_STR + "=").Length);
                Ref.SystemTargetSiloAddress = systemTargetStr;
            }
            else
            {
                grainIdStr = KeyString.Substring(grainIdIndex);
            }

            ParseGrainId(grainIdStr, out ulong n0, out ulong n1, out ulong typeCode, out string keyExt);
            Ref.IdN0         = n0;
            Ref.IdN1         = n1;
            Ref.TypeCodeData = typeCode;
            Ref.KeyExt       = keyExt;

            return(BondSerializer.Serialize(Ref));
        }
        // TODO: It would be AWESOME if we could just store this class directly, but
        // unfortunately, Bond's type aliases allow only primitive types to be aliased.
        // We should check to see if we can add support for custom types in Bond's source,
        // but for now, we're forced to do a double serialization here.
        public static ArraySegment <byte> ToByteArray(IGenericSerializable Serializable)
        {
            if (Serializable == null)
            {
                return(default(ArraySegment <byte>));
            }

            var Type   = Serializable.GetType();
            var Result = new SerializationGenericReference(0)
            {
                Type = BondSerializationUtil.GetTypeIdentifierString(Type),
                Data = BondSerializer.Serialize(Serializable)
            };

            return(BondSerializer.Serialize(Result));
        }
        public static GrainReference FromByteArray(ArraySegment <byte> Data, IGrainReferenceConverter GrainReferenceConverter)
        {
            if (Data.Count == 0)
            {
                return(null); // I actually think this never happens, because Bond simply leaves fields with default values out
            }
            var Ref = (SerializationGrainReference)BondSerializer.Deserialize(typeof(SerializationGrainReference), new ArraySegmentReaderStream(Data));

            var s = new StringBuilder();

            s.AppendFormat("{0:x16}{1:x16}{2:x16}", Ref.IdN0, Ref.IdN1, Ref.TypeCodeData);
            if (Ref.KeyExt != null)
            {
                s.Append("+");
                s.Append(Ref.KeyExt);
            }
            string IdStr = s.ToString();

            string KeyString;

            if (Ref.ObserverReferenceId != null)
            {
                KeyString = String.Format("{0}={1} {2}={3}", GRAIN_REFERENCE_STR, IdStr, OBSERVER_ID_STR, Ref.ObserverReferenceId.ToString());
            }
            else if (Ref.SystemTargetSiloAddress != null)
            {
                KeyString = String.Format("{0}={1} {2}={3}", GRAIN_REFERENCE_STR, IdStr, SYSTEM_TARGET_STR, Ref.SystemTargetSiloAddress);
            }
            else if (Ref.GenericArgs != null)
            {
                KeyString = String.Format("{0}={1} {2}={3}", GRAIN_REFERENCE_STR, IdStr, GENERIC_ARGUMENTS_STR, ConvertBackToGenericArgsString(Ref.GenericArgs));
            }
            else
            {
                KeyString = String.Format("{0}={1}", GRAIN_REFERENCE_STR, IdStr);
            }

            return(GrainReferenceConverter.GetGrainFromKeyString(KeyString));
        }
Ejemplo n.º 5
0
 public byte[] Serialize(object Object)
 {
     return(BondSerializer.Serialize(Object).ToArray());
 }
Ejemplo n.º 6
0
 public object Deserialize(Type ExpectedType, byte[] Data)
 {
     return(BondSerializer.Deserialize(ExpectedType, new MemoryStream(Data)));
 }
Ejemplo n.º 7
0
 public bool IsSupportedType(Type Type)
 {
     return(BondSerializer.CheckSupportedTypeForTopLevelSerialization(Type));
 }