public override bool Serialize <TSerializedResource>(KeyedResource owner, ref TSerializedResource[] serializedResources, ref short length, params Type[] expectedTypes)
        {
            var ownerLength     = _offset - owner.Offset;
            var remainingLength = length - ownerLength;
            var buffer          = new byte[remainingLength];

            if (Read(buffer, buffer.Length) != remainingLength)
            {
                return(false);
            }

            using (var subSerializer = new ReadResourceSerializer(new MemoryStream(buffer)))
            {
                var children = new List <TSerializedResource>();
                for (;;)
                {
                    // :frowning:
                    var child = (TSerializedResource)(SerializedResource)subSerializer.SerializeKeyedResource(expectedTypes);
                    if (child == null)
                    {
                        serializedResources = children.ToArray();
                        return(true);
                    }
                    children.Add(child);
                }
            }
        }
        private KeyedResource SerializeKeyedResource(params Type[] expectedTypes)
        {
            var keyedResourceHeader = new KeyedResource();
            var offset = _offset;

            if (!keyedResourceHeader.Serialize(this))
            {
                return(null);
            }
            foreach (var expectedType in expectedTypes)
            {
                var keyedResource = (KeyedResource)Activator.CreateInstance(expectedType);
                keyedResource.Offset       = offset;
                keyedResource.wValueLength = keyedResourceHeader.wValueLength;
                keyedResource.wLength      = keyedResourceHeader.wLength;
                keyedResource.wType        = keyedResourceHeader.wType;
                keyedResource.szKey        = keyedResourceHeader.szKey;
                var validatedKeyedResource = keyedResource as ValidatedKeyedResource;
                if (validatedKeyedResource == null || validatedKeyedResource.Validate())
                {
                    return(keyedResource.SerializeValue(this) && keyedResource.SerializeChildren(this) ? keyedResource : null);
                }
            }
            return(null);
        }
Пример #3
0
        public override bool Serialize <TSerializedResource>(KeyedResource owner, ref TSerializedResource[] serializedResources, ref short length, params Type[] expectedTypes)
        {
            var ownerLength = _totalWritten - owner.Offset;

            using (var memoryStream = new MemoryStream())
                using (var writer = new WriteResourceSerializer(memoryStream))
                {
                    foreach (var serializedResource in serializedResources)
                    {
                        var localSerializedResource = serializedResource;
                        writer.Serialize(ref localSerializedResource);
                    }
                    var bytes = memoryStream.ToArray();
                    length = (short)(ownerLength + bytes.Length);
                    return(Write(bytes));
                }
        }
Пример #4
0
 private void ClearHeader(KeyedResource r)
 {
     r.wLength      = 0;
     r.wValueLength = 0;
 }
 public abstract bool Serialize <TSerializedResource>(KeyedResource owner, ref TSerializedResource[] serializedResources, ref short length, params Type[] expectedTypes)
     where TSerializedResource : SerializedResource, new();