Two concepts are important here. The first is that all classes defined in the SAIF schema or external schemas are types of tuples, either directly or through their lineage; therefore all objects encoded in SAIF are instances of tuples. The second is that all objects are ultimately defined in terms of primitives and/or descriptions from enumerations. The ramifications of these statements are explained as follows. The Object Syntax Notation must be able to display data pertaining to one or more tuples. The internal structure of the tuples must provide data for the attributes. Each attribute is described by its domain. If the domain is an enumeration or primitive, the value is provided directly. If the domain is complex, the component parts must be described recursively until finally all values are given as primitives or descriptions from enumerations. A generic example is given below with appropriate commentary.
Class1 ( attribute1 : "text string value" attribute2 : description1FromEnumeration ) // The class to which the object belongs is stated and is followed by an // open parenthesis. Next each of the attributes are given, along with its // value. The attributes are given in a specific order. Attributes are // ordered by seniority, i.e., inherited attributes appear first and are // followed by those defined in the parent class. All attributes, whether // they were defined by the parent class or inherited from an ancestor, // will be ordered as provided by their respective CSN definitions. The // first attribute is assigned a value from the String domain, with the // value given in double quotes. The second attribute comes from an // enumeration with the description provided without quotes. // Note that if an object is to be shared or referenced by other objects, // the first attribute would be objectIdentifier followed by its particular // value. The value would be preceeded by an asterisk ( * ), and the value // itself would be either an integer or a string value. For example, the // first attribute might be either: // objectIdentifier: *47 // or // objectIdentifier: *A23_z Class1 ( attribute1 : "another string value" attribute2 : description2FromEnumeration ) // Above is another object from the same class. The attributes are the same, // but the values are different. // The object below, from Class2, contains five attributes. Class2 ( attribute1 : integerValue1 attribute2 : Class10 ( attributeA : true attributeB : realValue1 ) // The first attribute is assigned a value from an integer domain; it might // be equal to 1280 for example. The second attribute, attribute2, comes // from the domain Class10, where two attributes are specified; attributeA // takes the boolean value true and attributeB is a real number, such as // 0.314. attribute3 : Class11 ( attributeC: *144 attributeD: Class12 ( attributeX : integerValue2 attributeY : integerValue3 ) ) // The third attribute comes from the domain Class11 and contains two // attributes, the first of which, attributeC, is assigned the value 144, // the objectIdentifer of some other object. (The value is preceeded by the // asterisk to indicate that it is an objectIdentifier.) The second // attribute, attributeD comes from Class12 and consists of attributeX and // attributeY, both of which have integer values. attribute4 : IsoList { integerValue11 integerValue12 integerValue13 } // The fourth attribute has a domain consisting of a list of integers, here // instantiated as an isolist consisting of three integer values, e.g., // IsoList(17 23 14) . Note that with sets and lists, braces are used to // enclose the values, instead of parentheses. attribute5 : IsoSet { Class3 ( attributeE : realValue2 attributeF : "string ...." ) Class3 ( attributeE : realValue3 attributeF : "string ---" ) } // The fifth attribute comes from a set of objects in Class3. Two instances // of Class3 are given, each listing a real value for attributeE and a // string value for attributeF. ) // The OSN statement of the object finishes with a closing parenthesis.