private static object Deserialize(string yaml) { var stream = new MemoryStream(); var writer = new StreamWriter(stream); writer.Write(yaml); writer.Flush(); stream.Position = 0; bool aliasOccurred; AttachedYamlAssetMetadata metadata; var instance = new YamlAssetSerializer().Load(stream, "MyAsset", null, true, out aliasOccurred, out metadata); return(instance); }
protected override bool ProcessObject(object obj, Type expectedType) { foreach (var unloadedObject in ItemsToReload) { // If a collection, stop at parent path level (since index will be already removed, we will never visit the target slot) // TODO: Check if the fact we didn't enter in an item with index affect visitor states // Other case, stop on the actual member (since we'll just visit null) var expectedPath = unloadedObject.Path.Decompose().Last().GetIndex() != null ? unloadedObject.ParentPath : unloadedObject.Path; if (CurrentPath.Match(expectedPath)) { var eventReader = new EventReader(new MemoryParser(unloadedObject.ParsingEvents)); var settings = Log != null ? new SerializerContextSettings { Logger = Log } : null; PropertyContainer properties; unloadedObject.UpdatedObject = AssetYamlSerializer.Default.Deserialize(eventReader, null, unloadedObject.ExpectedType, out properties, settings); // We will have broken references here because we are deserializing objects individually, so we don't pass any logger to discard warnings var metadata = YamlAssetSerializer.CreateAndProcessMetadata(properties, unloadedObject.UpdatedObject, false); var overrides = metadata.RetrieveMetadata(AssetObjectSerializerBackend.OverrideDictionaryKey); unloadedObject.Overrides = overrides; var references = metadata.RetrieveMetadata(AssetObjectSerializerBackend.ObjectReferencesKey); if (references != null) { var basePath = YamlAssetPath.FromMemberPath(CurrentPath, root); foreach (var reference in references) { var basePathWithIndex = basePath.Clone(); if (unloadedObject.GraphPathIndex != NodeIndex.Empty) { if (unloadedObject.ItemId == ItemId.Empty) { basePathWithIndex.PushIndex(unloadedObject.GraphPathIndex.Value); } else { basePathWithIndex.PushItemId(unloadedObject.ItemId); } } var actualPath = basePathWithIndex.Append(reference.Key); ObjectReferences.Set(actualPath, reference.Value); } } } } return(false); }
public void TestSimpleSerialization() { var asset = new MyAsset { Strings = { "aa", "bb" } }; var asset1Ids = CollectionItemIdHelper.GetCollectionItemIds(asset.Strings); asset1Ids.Add(0, new ItemId(MakeArray(1))); asset1Ids.Add(1, new ItemId(MakeArray(2))); var serializer = new YamlAssetSerializer(); var stream = new MemoryStream(); serializer.Save(stream, asset, null); stream.Position = 0; bool aliasOccurred; AttachedYamlAssetMetadata metadata; var loadedAsset = (MyAsset)serializer.Load(stream, null, null, true, out aliasOccurred, out metadata); var asset2Ids = CollectionItemIdHelper.GetCollectionItemIds(loadedAsset.Strings); Assert.Equal(2, asset2Ids.KeyCount); Assert.Equal(asset1Ids[0], asset2Ids[0]); Assert.Equal(asset1Ids[1], asset2Ids[1]); }
public void TestSimpleSerialization() { var asset = new MyAsset { Strings = { "aa", "bb" } }; var asset1Ids = CollectionItemIdHelper.GetCollectionItemIds(asset.Strings); asset1Ids.Add(0, new ItemId(MakeArray(1))); asset1Ids.Add(1, new ItemId(MakeArray(2))); var serializer = new YamlAssetSerializer(); var stream = new MemoryStream(); serializer.Save(stream, asset); stream.Position = 0; bool aliasOccurred; Dictionary <YamlAssetPath, OverrideType> overrides; var loadedAsset = (MyAsset)serializer.Load(stream, null, null, out aliasOccurred, out overrides); var asset2Ids = CollectionItemIdHelper.GetCollectionItemIds(loadedAsset.Strings); Assert.AreEqual(2, asset2Ids.KeyCount); Assert.AreEqual(asset1Ids[0], asset2Ids[0]); Assert.AreEqual(asset1Ids[1], asset2Ids[1]); }